このドキュメントは対象とするMonoのバージョンが古くなっています。 より新しいバージョンについては以下のページを参照してください。
ここでは、同じソースコードをコンパイルした物を、RedHat Linux 9上のMono 1.0とWindows XP上の.NET Framework version 1.1とで動作させた場合の結果の相違について考察します。 それぞれ、対象となる各名前空間に存在する基本的なクラスを用いて簡単な動作をさせています。 また、一方で生成したアセンブリが他方でも動作するかもテストします。 コンパイラにはmcsおよび.NET Framework version 1.1のcscを使用しました。
System名前空間
System名前空間に存在するクラスを利用してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
結果について見てみます。 OSのバージョンやシステムディレクトリなど、システムに依存する部分の結果は異なっています。 OSのバージョンについては、 Monoではカーネルのバージョンが表示されています。 また、乱数については同じシード値を用いていて全く同じ結果が出力されていることから、同じ乱数生成アルゴリズムが使われていると考えられます。
System.Collections名前空間
次にSystem.Collections名前空間に存在するクラスを利用してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
環境に依存する処理も無いので、全く同じ結果が出力されています。
System.IO名前空間
続いて、System.IO名前空間に存在するクラスを利用してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
Windows とLinuxでファイルシステムが異なっているため、論理ドライブ名は各ディレクトリとして出力されています。 ファイルの属性などはWindowsのファイルシステムのものが表示されるようになっています。 DirectorySeparatorCharなどはシステムに依存した値になっています。 また、ファイルへの書き込み、移動・コピーなども正常に行われました。
System.Text名前空間
次はSystem.Text名前空間に存在するクラスを利用してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
default.txt はシステムで用いられているエンコーディングで文字列を出力したファイルです。 LinuxではEUC-JP、WindowsではShiftJISを使用しているので上記の様な結果になっています。 また、ほかのエンコーディングで出力した結果もそれぞれ同じになっています。
System.Threading名前空間
続いて、System.Threading名前空間に存在するクラスを利用してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
実行順序はシステムの状態によって可変するので結果は異なっていますが、CalculateAとCalculateBはそれぞれ10回・5回ずつ呼び出されています。
System.Globalization名前空間
次はSystem.Globalozation名前空間に存在するクラスを利用してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
現在のスレッドのカルチャを取得・設定したり、暦を変更したりすることも問題なく出来ています。 表示されたカルチャセットに相違があるのは、カルチャセットがシステムに存在するか否かによるからです。
System.Security.Cryptography名前空間
続いては、System.Security.Cryptography名前空間に存在するクラスを利用してDESアルゴリズムによる暗号化・復号化を試みます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
暗号化・復号化ともに問題なく動作しています。
System.Runtime.Serialization名前空間
System.Runtime.Serialization名前空間に存在するクラスを用いて、バイナリシリアル化を実行してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
シリアル化・逆シリアル化は正常に行われています。 ダンプ結果も同じ事から、Monoでシリアル化したデータを.NET Frameworkで逆シリアル化する事、またその逆も可能であると考えられます。
System.Xml名前空間
最後にSystem.Xml名前空間に存在するクラスを利用して簡単なXML文書(RSS)を作成してみます。
- cscでコンパイルしたアセンブリ、RedHat Linux上のMonoで動作OK
- mcsでコンパイルしたアセンブリ、Windows XP上の.NET Frameworkで動作OK
双方ともに全く問題なく動作しています。
まとめ
今回はコアライブラリに含まれる基本的なクラスだけを抜粋して検証してきましたが、システムに依存する部分を除けばその全てについて.NET Frameworkと完全に同じ結果が得られる事が分かりました。 他のクラスについてもほぼ同様だと考えられます。 また、mcsでコンパイルしたアセンブリもcscでコンパイルしたアセンブリも、Monoおよび.NET Frameworkのどちらでも動作することが確認できました。 このことからも分かるとおり、今回調査したコアライブラリのクラスだけについて見れば、 Monoは.NET Frameworkと完全な互換性を持っているということが言えると思います。