.NETアプリをLinux対応にするMono

.NET互換言語を使用して、クロス・プラットフォーム機能を維持しながらLinuxアプリケーションを構築する

Monoは、.NETに基づくオープン・ソース開発プラットフォームであり、多様な.NET互換言語を使用してパワフルで柔軟性の高いLinux®アプリケーションを構築でき、しかも、クロス・プラットフォーム機能を利用することができます。この記事では、Monoをシステムにインストールする手順と、LinuxとMicrosoft® Windows®の両方で動作する、Monoによってコンパイルされた初めてのサンプルC#アプリケーションを開発する手順を説明します。

Eli Dow, Software Engineer, IBM Linux Test and Integration Center

Eli Dowは、ニューヨーク州Poughkeepsieにある、IBM Linux Test and Integration Centerのソフトウェア技術者です。Clarkson Universityにて、コンピューター・サイエンスおよび心理学で学位を、またコンピューター・サイエンスで修士を取得しています。彼が関心を持っている領域は、GNOMEデスクトップや、人とコンピューターの対話動作、Linuxシステム・プログラミングなどです。



2005年 9月 19日 (初版 2005年 9月 15日)

C#言語は、Microsoft .NETプラットフォーム向けの多種多様なアプリケーションを短時間で構築するためのオブジェクト指向言語です。C#と.NETの目的は、型安全性問題、メモリー管理、ライブラリー構築など、低レベルのプログラミング問題からプログラマーを解放して、アプリケーションの構築とビジネス・ロジックに専念できるようにすることです。これが、開発サイクルの短縮に役立つはずです。

C#および.NET戦略については、さまざまな議論がありますが、この動きに対してLinuxコミュニティーはどう反応しているのだろうと思っている人もいるでしょう。この記事では、オープン・ソースの世界が(Novellの強力なバックアップを受けて)独自のコンパイラーとクラス・ライブラリーを実装することによって、この言語をどのように取り込むことにしたのか解説します。(実際、いくつかのオープン・ソース実装が進行中です。)

この記事では、.NETフレームワークに基づき、Novellが支援しているオープン・ソース開発プラットフォーム、Monoに焦点を当てます。この記事では、Monoをシステムにインストールする手順と、LinuxとMicrosoft Windowsの両方で動作する、Monoによってコンパイルされた初めてのサンプルC#アプリケーションを開発する手順を説明します。

Monoの多くの利点

Monoは、多様な.NET互換言語を使用して、クロス・プラットフォーム機能を保ちつつLinuxアプリケーションを構築するプログラミングのパワーと柔軟性をオープン・ソース開発者に与えます。現在の.NET開発者にとってMonoの最大の利点の1つは、Linuxへの容易な移行パスが得られることです。Monoプロジェクトには、非常にオープンで活発な開発コミュニティーがあり、.NETクライアントおよびサーバー・アプリケーションの実行に必要な開発者向けツールとインフラストラクチャーの両方を提供しています。

おそらく、Monoアーキテクチャーを使用する最も重要な利点は、言語独立が得られることです。Monoでは、.NETランタイムでサポートされている言語から、任意の既存コードを利用することができます。

次のことを考えてみてください。従来のLinuxプログラミングは、多くの場合、完全にCだけで行われています。通常、Pythonなど別の言語を使用したいときには、ネイティブCコード用のPythonバインディングを使用する必要があります。

バインディングを作成するというこのアプローチは、常に最適で簡単な方法というわけではなく、場合によってはバインディングが存在しないこともあります。したがって、Monoでは、Monoがサポートしている言語の1つから、他のMonoサポート言語の既存のコードにアクセスできるようになっています。C#、Python、またはJavaTMでアプリケーションを作成して、バインディングを必要とせずに、他の言語のクラスを再利用することができます。(もう少し後で、Platform Invocation Facility(pinvoke)を介してC#プログラムからCライブラリー・コードを使用する例を紹介します。)

すでに述べたように、コードのプラットフォーム独立も実現できます。これは自動的に行われます。.NETコードはマシン・コードにコンパイルされるわけではなく、中間言語(Intermediate Language:IL)にコンパイルされるからです。Monoによって提供される.NETランタイムで使用されるILは、プラットフォーム間でのバイナリーのコピーを可能にします。このアイデアは、Java開発者にはおなじみのものであり、「一度書けば、どこでも動作する」という概念を反映しています。

Monoは、.NETフレームワーク・クラス・ライブラリーの、時間を節約できる自由な実装も可能にします。このライブラリーは、すでにさまざまな一般的プログラミング・タスク向けにコードが作成され、テストされています(あまり一般的でないものもあります)。ライブラリーには、最も一般的なデータ構造、暗号化ライブラリー、XML、およびWebサービス・サポートが含まれています。

.NETフレームワークでは多くの言語を使用できますが、.NET開発者に最も高く評価されているのはC#です。C#は、ガベージ・コレクション付きの効果的な言語であり、パワフルなオブジェクト指向機能を備え、プログラマーは中核的なプログラミング・タスクを短時間で処理することができます。この言語は、最近のC派生言語でプログラミングしたことがある人のほとんどにとって親しみやすい構文になっていますが、最近のスクリプティング言語を使用している人にとって使いやすい便利な機能も備えています。

最後に、Mono JIT(Just In Time)コンパイラーは高速であり、これらすべての利点を妥当なパフォーマンス・レベルで提供します。


Monoの仕組みの詳細

Monoプロジェクトには、次のオープン・ソース実装が含まれています。

  • C#コンパイラー
  • 仮想実行システム(JITコンパイラー、ガベージ・コレクター、ローダー、およびスレッディング・エンジンを含む)
  • .NETクラス・ライブラリーの実装
  • ビジュアル開発ツールおよびデバッガー

Monoプロジェクトのツールは、Linux、Windows、Mac OS Xをはじめとして、さまざまなハードウェアおよびオペレーティング・システムで動作します。

サポートの程度はさまざまですが、Monoプロジェクトが現在サポートしている言語は次のとおりです。

  • C#
  • Java
  • Boo
  • Nemerle
  • Visual Basic.NET
  • Python
  • JavaScript
  • Oberon
  • PHP
  • Object Pascal
  • And more

これらのすべてが、C#ランタイムほど完全にサポートされているわけではありません。たとえば、Javaは直接サポートされるわけではなく、JavaバイトコードからILへのオンザフライ変換を使用します。

もうひとつの実装の完全さの差異の例として、Python実装は最近、行き詰っているようです。Pythonを追及している開発者は、より完全なスクリプティング言語実装であるBooを使用した方がよいかもしれません(Pythonに似ていますが、.NETフレームワーク向けに設計されたものです)。Monoによってサポートされる言語について説明するときには、.NETプラットフォーム向けの新しいハイブリッド・プログラミング言語(関数型、オブジェクト指向、命令)であるNemerleに触れておくべきでしょう。

いくつかの政治的問題

一部の人々は、なぜオープン・ソース擁護者がMicrosoft製品を取り込もうとしているのか怪訝に思っています。事実、多くの人は、そもそもMicrosoftがなぜこれを許しているのか疑問に思っています。

これが可能であり、奨励されてさえいる理由は、MicrosoftがC#とCLIを標準化するという約束に従っているからです。このような標準化と仕様を理由として、Monoチームは、C#およびCLI(Common Language Infrastructure)のECMA標準の独自のオープン実装を構築することができたのです。事実、コンパイラーと言語そのものが、他の人も実装できるようにオープンに指定されています。

Monoをめぐる騒動の多くは、提供されたクラス・ライブラリーが必ずしもオープン仕様としてカバーされていないという議論に端を発しています。これが、不可避的に、MicrosoftがLinux攻撃戦略の一環として特許を使用してMonoを攻撃するつもりかについて、また特許に関する過熱した論争につながっています。これを受けて、Mono開発者たちは、2つの独立したライブラリー・セットを提供しています。

1つのライブリー・セットは、Micorosoft .NETライブラリーの再実装であり、Microsoft .NETアプリケーションとの互換性目的で使用されます。これには、ADO.NET、System.Windows.Forms、およびASP.NETが含まれます。

また、Mono開発者たちは、独自のパワフルなライブラリーをゼロから大量に作成しました。これらは既存のオープン・ソース・ライブラリーとテクノロジーに基づき、特許侵害の懸念を払拭すると同時に、同等機能を提供することを目的としています。たとえば、MonoにはGtk#と呼ばれるウィンドウ方式のテクノロジー、gtk+ツールキット用C#バインディングのセット、および多彩なGNOMEライブラリーが含まれています。これによりアプリケーション開発者は、Monoを使用して、完全にネイティブなGNOMEアプリケーションを作成することができます。このライブラリーは、MicrosoftのSystem.Windows.Formsライブラリーのオープン・ソース版と考えることができます。

Monoが動作するプラットフォーム

Monoは、複数のハードウェア・プラットフォーム上のLinux、FreeBSD、Windows、およびMac OS Xで、正常に移植されています。おそらく、これはデスクトップ市場の99%をカバーしています。

表1. Monoプラットフォーム
プラットフォームインタープリタージッター(高速)
Linux/AlphaYesNo
Linux/ARMYesYes
Linux/MIPSYesNo
Linux (PPC)YesYes
Linux (S390)YesYes
Linux/SPARCYesYes
Linux (x86)YesYes
Linux/x86-64 (64-bit port)YesYes
FreeBSD (x86)YesYes
HP-UX/HPPAYesNo
MacOS XYesYes
Solaris/SPARC v8YesYes
Solaris/SPARC v9 (64-bit port)YesYes
Windows 2000/XPYesYes

Monoのインストール

では、Monoのインストールがどのようなものか見てみましょう。

Windows上のMono

MonoをWindowsオペレーティング・システムにインストールするには、Windows 2000またはWindows XPを実行している必要があります。まず、Mono Win32インストーラーの最新エディションを、NovellForgeでホストされているMono Windows Integration Projectホーム・ページからダウンロードします(この記事の末尾の「参考文献」を参照)。ダウンロードが完了したら、実行可能なインストーラーを実行します。

インストール・プロセスは、他の製品のインストールと同様です。最初に、ライセンスを受け入れるか受け入れないかをたずねられます。受け入れた後は、インストール先を指定して、オプション・コンポーネントを選択するだけです。

Monoフレームワークを学習するには、デフォルト・インストールを使用することをお勧めします。これによって、スタート・メニューに一般的なツールの項目が追加されます。これらは、[Mono-1.1.7 for Windows]プログラム・グループに登録されます。

Linux上のMono

Linux用Monoのインストールは、ほとんどの場合、比較的簡単です(各ディストリビューション用パッケージの入手方法の詳細は、この記事の範囲を越えています)。

SUSE、Red Hat、Ubuntu用などのバイナリー・インストール・パッケージは、容易に入手できます。Gentooなどのソース・ベースのディストリビューションも、わずかな操作で簡単にセットアップできます。


Monoインストールのテスト

コア・コンパイラー(mcs)とランタイム(mono)をテストするには、単純なプログラムを作成して、コンパイルする必要があります。プログラムの作成は、好きなテキスト・エディターで行うことができます。このファイルを作成する近道として(ただし、エレガントな書式設定はまったく含まれていません)、端末プロンプトから次のコマンドを実行してください(すべて1行で)。

$ echo 'class X { static void Main () { System.Console.Write("My first
mono app worked!\n");} }' > example.cs
.

このコマンドは、example.csという名前のC#ソース・ファイルを作成します(このファイルexample.csと実行可能ファイルexample.exeは、下記の「ダウンロード」からダウンロードすることもできます)。(Linuxを使用している場合は、bashプロンプトを使用してください。Windowsを使用している場合は、スタート・メニューからMonoコマンド・プロンプトを起動してください。)

コンパイラーによる実行可能ファイルの作成をテストするには、次のコマンドを実行します。

$ mcs example.cs

これで、example.exeという名前のバイナリーができます。このバイナリーを実行して、ランタイムをテストするには、次のコマンドを使用します。

$ mono example.exe

何も問題がなければ、コンソールに"My first mono app worked!"と表示されます。

図1. 何も問題がなかった場合の表示
何も問題がなかった場合の表示

実際、作成された実行可能ファイルを別のシステム、おそらくWindowsが稼動しているシステムにコピーして、そこでそのまま実行することができます。


Mono以外のライブラリーのコードの使用

Monoプラットフォームを使用するより魅力的な理由の1つは、C#コードから、場合によってはC#以外の既存のライブラリーのコードを使用できることです。その例を以下に示します(リスト2(PInvokeExample.cs)と実行可能ファイルPInvokeExample.exeは、下記の「ダウンロード」からダウンロードすることもできます)。

この機能を提供するメカニズムは、Platform Invocation Facility(pinvoke)です。

リスト2. Platform Invocation Facilityの使用
/* Platform Invocation Facility Example
   This code is intended to illustrate P/Invoke.
   For out purposes we will access a c shared library.
*/

using System;
// This is a lot of the magic!
using System.Runtime.InteropServices;
/* Class illustrates pinvoking existing c library code */
public class PInvokeExample
{
   /* Notifying the runtime that we need an
          additional mathematics library, libm.so */
   [DllImport("libm")]

   /* Here we define the external function we will
           be using from the library,

           You must declare these methods to be static.
      The function signature you provide must match the
           signature in the external library!
   */
        static extern double sqrt ( double element );


   public static void Main ()
   {
      Console.WriteLine("The square root of 100.0 is {0}.", sqrt(100.0));
   }
}

この単純化されたコードを見るとわかるように、必要なのは、ライブラリーを使用するようにMonoコンパイラーに指示して(これは、DLLImport行で行われています)、使用したい関数のプロトタイプを指示することだけです。このクラスをLinuxシステム上でコンパイルすると、正しい答えがコンソールに出力されます。

図2. C#以外のライブラリーの使用
C#以外のライブラリーの使用

その他のMonoの利点

Monoのランタイムをアプリケーションに埋め込んで、パッケージ化と発送を単純化することもできます。さらに、Monoプロジェクトは統合開発環境、デバッガー、ヘルプ・ブラウザーも提供しています。

C#および.NETフレームワークの詳細を知りたい場合は、下記にリストされているさまざまな参考文献を参照してください。これには、EclipseやMonodevelopなど、開発プロセスをさらに単純化するためのさまざまな統合開発環境へのリンクも含まれています。

Monoでのグラフィカル・アプリケーションの開発に興味がある方には、詳細なチュートリアルとして"Mono: A Developers Notebook"をお勧めします(「参考文献」を参照)。

Novellのプログラマーたちは、Monoに新機能を追加し、オープン・ソース開発者の作業を容易にするツールを提供し続けています。この記事によってMonoプロジェクトに興味を持ち、次のLinux開発プロジェクトに役立ててもらえたら幸いです。


ダウンロード

内容ファイル名サイズ
Installation test sourceexample.cs1 KB
Installation test executableexample.exe3 KB
PInvoke sample sourcePInvokeExample.cs1 KB
PInvoke sample executablePInvokeExample.exe3 KB

参考文献

学ぶために

製品や技術を入手するために

  • Monoプロジェクトのダウンロード・ページから、様々なプラットフォーム用のMonoをダウンロードしてください。
  • Eclipse for developing Mono applicationsは、C#やその他のMono言語に対してEclipse IDEを使うための情報を提供しています。
  • DotGNUは、WebサービスやC#プログラムのための無料ソフトウェア・ソリューションを提供しています。
  • MonoDevelopは、SharpDevelopをGtk#に移植するためのプロジェクトとして、C#とMono用のUNIXのために、最高の開発環境を構築しようとしています。
  • Gtk#には、gtk+ツールキット用のC#バインディングと、様々なGNOMEライブラリーがあります。
  • Mono Windows Integration Projectでは、Windowsで使うためのMonoと、そのためのツール・セットを開発しています。
  • 皆さんの次期Linux開発プロジェクトを、IBM trial softwareを使って構築してください。developerWorksから直接ダウンロードすることができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=239752
ArticleTitle=.NETアプリをLinux対応にするMono
publish-date=09192005