8


0

Monoは.NETのサブセットですか?

私はその逆は真実ではないことを知っていますが、Monoを使用してアプリケーションが動作する場合、実際の取引に切り替えると動作することが保証されていますか? そうでない場合、警告のリストはどこにありますか?

4 Answer


18


Monoと.NETの両方は、ECMA / ISO CLIファミリの仕様のスーパーセットです。 ただし、.NETもMonoも他のサブセットではありません。 Monoと.NETはどちらもECMA / ISO CLIの上に機能を追加しますが、Monoは.NETの追加の多くを実装しますが、.NETはMonoの追加を実装しません。

いくつか例を挙げましょう。

  • Monoには、より大きな配列があります。 これは実際には_not_追加機能ではありません ECMA / ISO CLI仕様ですが、オプションの仕様:仕様では、配列インデックスは32ビットまたは64ビットのいずれかでなければならないことが規定されています。 .NETは32ビットを選択しましたが、Monoは64を選択しました。100億エントリ以上の配列は、Monoの市場シェアが非常に高いスーパーコンピューティングアプリケーションでは非常に一般的だからです。 そのため、アプリに数十億のエントリを持つ配列がある場合、Monoでは正常に動作しますが、.NETでは動作しません。

  • MonoにはVMに継続機能が組み込まれています。 これらはゲームにとって重要です プログラミング。

  • Monoは、アレイの並列操作に対してネイティブSIMDをサポートしています。 ネイティブCPU SIMD命令(MMX、SSE、VMX)にマップされます。

  • Monoにはコンパイラとしてのコンパイラがありますが、Microsoftはこれを漠然としかしていません .NETの不特定の将来のバージョンについて話しています。

  • Monoには多くの追加ライブラリがあり、特に Windowsフォーム以外のグラフィックスライブラリ(wx.NET、Gtk#、Cocoa#など)

ただし、(配列を除く)これらはすべて、名前空間によって明確に区別できることに注意してください。これらはいずれも、 System`または Microsoft`名前空間に存在しないためです。

'' '' '

編集:実際には、上記の拡張機能のほとんどは、.NETでも動作するように明示的に設計されています。 たとえば、 `Mono.Simd`も実行されます .NET, but without the runtime support that the Mono VM has, it’s 使用できないほど遅い。 (基本的に、すべてのSIMD操作はC#で実装されますが、Monoコンパイラはこれらの呼び出しを検出し、対応するアセンブリ命令に置き換えます。 そうすれば、それらは.NETで動作しますが、特別な処理なしでは大幅に遅くなります。)また、C#REPLは現在、 `Reflection.Emit`の上に再実装されています(現時点ではMonoコンパイラを呼び出しています)直接)、将来的に.NETで動作するようにします。 Gtk#は、Windowsおよび.NETで正常に動作します。

継続にはVMレベルのサポートが必要なため、.Monoには `Mono.Tasklet`ライブラリのみを実装できません。


3


No. Monoには、いくつかの代替UIフレームワーク(Gtk#、wxWindows for .NET, etc).

ただし、Microsoft定義のクラスのみを使用する場合は、問題ないはずです。


2


Monoは、http://en.wikipedia.org/wiki/Common_Language_Runtime [CLR]と同様に、http://en.wikipedia.org/wiki/Common_Language_Infrastructure [CLI]標準の実装です。

NET BCLにあるライブラリの多くが含まれていますが、Windows固有のものは含まれていません(WMIは頭に浮かぶ1つのドメイン全体です)。

ウィンドウ固有ではない機能を維持している限り、問題ありません。

monoチームは、コードがmonoで動作するかどうかをチェックするツールを作成しました-http://www.mono-project.com/MoMA[MoMA]、Mono Migration Analyzer。

Microsoftコンパイラでモノコードを使用する限り、使用しているライブラリを含め、LinuxでpInvokesを実行していない限り、問題ありません。


2


Monoは、少なくとも `System`名前空間では、BCL APIを拡張しません。 したがって、 `System`名前空間の型のみを使用するアプリケーションは、Monoから.NETに再コンパイルせずに移植できることを確信できます。 もちろん、.NETの世界にいれば、 `Mono`名前空間には何も見つかりません。

Mono FAQから:

_ _ * .NETを受け入れて拡張する予定ですか?*

優れたテクノロジーを採用するのは良いことです。 互換性のない方法でテクノロジーを拡張することはユーザーにとって悪いため、テクノロジーに互換性のない変更を加える予定はありません。

革新的なアイデアがあり、新しいクラスを作成したい場合は、Monoと.NETの両方でそれらのクラスを正しく動作させることをお勧めします。 現在、Monoには、Monoコミュニティのメンバーまたは他のグループのいずれかによって開発された多数の追加ライブラリが付属しています。 場合によっては、Microsoftからのビットが不完全であることが判明しましたが、APIの破損を回避し、代わりに新しいアセンブリで欠落している機能を公開しています(Mono.Securityを参照) _ _