これは馬鹿げた質問かもしれませんが、私はMonoプロジェクトを調査していただけで、インストールに関するセクションがあります WindowsでのMono 。しかし、Windowsには明らかに.NETランタイムがすでにあるので、Mono for Windowsを使用することの正確なポイントは誰にでもわかりますか?クロスプラットフォーム開発などに役立ちますか?
Monoは.NetをMS .Net Frameworkと同じように100%実装していないため、Linuxで実行しなくてもMonoでテストできるのは良いことです。また、Monoには、MSがサポートしていないGTKでフォームを作成するためのバインディングがあります。
Monoには、.NETにはない機能がいくつかあります。
Monoは高度にモジュール化されています。あなたはそれを小さな小さな断片に分解し、デプロイすることができます正確に必要なそれらのパーツのみ。 System.Xmlが不要ですか?結構です。
モノは埋め込み可能です。 C/C++アプリケーション内でホストして、ユーザーが安全に管理されたサンドボックス環境からスクリプトを実行できるようにすることができます。この最も有名な例はmod_monoで、これはApache Webサーバー内でMonoをホストし、たとえばASP.NETがMonoでどのように実装されているかを示します。この機能は、上記のモジュール化と相性がいいです。
これについてはすでに触れました:静的リンク。 Alsoはモジュール化と相性がいい。
サービスとしてのコンパイラは別のものです。 Anders Hejlsbergはlongの時間、そしてmaybeについてそれについて話していました、おそらくそれはC#5.0の準備ができているでしょう。まあ、Monoにはすでにそれがあり、実際には何年も使っていました。
Monoのリード開発者であるMiguel de Icazaもまた、「Embrace and Extend.NET」と呼んでいるイニシアチブを持っています。これは、他のCLI実装(.NETを含む)では(現在)不可能である方法でCLIを拡張します。これまでのところ、Embrace and Extend.NETには3つの機能があります。
Mono.Simd。基盤となるCPUのSIMD命令への安全で制御されたアクセスを提供します(例:SSEまたはPowerPCではAltiVec)。ゲームおよびグラフィックスに使用されます。
ECMA仕様で許可されている64ビット配列のインデックスですが、実際にインデックスを提供するのはMonoだけですVM。スーパーコンピューティングで使用されます。
そして最近では、継続。これは実際にはMonoが仕様の領域から外れるのは初めてです。長い配列インデックスは仕様に従って完全に有効であり、Mono.SimdはすべてのCLI準拠の実装でも機能します(ただしvery SLOW)ただし、Mono.Taskletは、CLIまたは.NETの一部ではないVMからの特別なサポートを必要とします。これは、Second Lifeなどのゲームロジックで使用されます。
たとえば、monoは静的リンクをサポートしているため、個別のランタイムインストーラーを必要とせずにアプリをビルド、コンパイル、および配布できます。クロスプラットフォームになるためにモノに依存するアプリを構築した場合、.Netとの違いがいくつかあります。そのため、Windowsでモノに固執することは、互換性をより確実に保証します。
BCLには、WPFやWinformsなど、まだモノに移植されていない場所がいくつかあります。
Mac/linuxでも動作するアプリが必要な場合は、Windowsでほとんどの作業を行っている場合でも、おそらく最初にモノ用に開発する必要があります。
注:このすべての以前の.Net Core/Standard。
Monoの テクニカルFAQ から:
本物を実行できるのに、なぜWindowsをサポートするのですか?
さまざまな理由があります。
Windowsをサポートすることで、ポータブルではないバージョンからMonoのポータブル部分を識別し、将来的にMonoのポータブル性を高めることができます。
問題を分割することでMonoの問題を切り分けることができるので、それは私たちを助けます(ランタイムの問題ですか、それともOSの問題ですか?)。
Monoへの貢献者の約半分はWindows開発者です。これらの取り組みに貢献する理由はさまざまですが、開発者が新しいオペレーティングシステムを使用せずにWindowsでランタイムを実行できるようにすることが非常に重要です。
Monoは、Windowsレジストリの大幅な変更、システムDLLの更新、Windows/System32パスへのDLLのインストールは行いません。
これは、Windowsベースの開発者がLinuxにデプロイする前に、Monoでコードをテストするのに役立ちます。
MonoとMonoを組み込んだアプリケーションは、インストーラーなしでデプロイできます(.NETランタイムをインストールせずに、アプリケーションと必要なMonoファイルを「xcopy」でデプロイできます)。
C#でクロスプラットフォームアプリケーションを開発する場合、他のプラットフォームと完全に互換性のある代替手段がないため、Microsoftの実装を使用することは最も賢明ではありません。
したがって、WindowsでMonoを使用してアプリケーションを開発すると、他のOSへの移植で問題がほとんど発生しなくなります(P/Invokeなどの他の穴を避ければ)。
レジストリやシステムファイルの量が原因でWindows PCに.Netフレームワークをインストールすることが許可されていないため、一部の人々はそれを使用しています。 (厳しく管理された環境で。)
一方、MonoはProgram Filesに自己完結しており、パスを含むレジストリキーのみを書き込みます(実行する必要はありません)。
これはちょっとばかげていると思いますが、それは複数のユーザーが私たちに言ったものです。
これは主に、Mono固有のライブラリ用のMonoアプリを開発するための補助として存在します。また、Monoの開発時に開発者が自然環境で作業できるように、原因を促進するためにも役立ちます。
広くは関心がありませんが、monoが標準のMicrosoftランタイムよりも改善されているケースがいくつかあります。 Migelは、PDC今年、これらのいくつかについて講演しました:
これらの投稿を参照してください:
また、Monoに動的にリンクされたプログラムがある場合でも、コンパイルされた.exeおよびMonoランタイムをペンドライブで実行し、.NET/Monoがインストールされていない別のコンピューターに移動して、ランタイムインストールなしで新しいPCでそのプログラムを実行できます。つまり、ポータブルアプリにつながります(特にポータブルUSBペンドライブアプリとして役立ちます)。これは.NETでは不可能です。 .NETランタイムを特定のインストーラーの方法でインストールする必要があります。つまり、ランタイムを含むランタイムにはフォルダーのコピーと貼り付けができません。
彼らがこれを行った主な理由は、Monoと.NETで.NETアプリケーションを並べて実行して比較できるようにするためだと思います。また、Monoライブラリに依存するアプリケーションがいくつかあります。
他の回答で言及されている多くの理由に加えて、Wine内で.Netアプリケーションを実行できるようにするには、Mono for WindowsをWineにインストールする必要がある場合があります。