モノはプライムタイムに間に合うのか?

.net open-source mono


大規模または中規模のプロジェクトでオープンソースの.NET実装であるMonoを使用した人はいますか?実世界の実稼働環境に対応できるかどうか疑問に思っています。それは安定していて、速くて、互換性がありますか...使用するのに十分ですか?それはMonoランタイムにポートプロジェクトに多くの労力がかかる、または本当に、あるいは本当にただの取るとMicrosoftのランタイムのため、すでに書かれたコードを実行するための互換性は十分?




Answer 1 miguel.de.icaza


考慮すべきシナリオはいくつかあります。(a)既存のアプリケーションを移植していて、Monoがこの作業に十分に適しているかどうか疑問に思っている場合、(b)新しいコードを書き始めていて、Monoが十分に成熟しているかどうかを知りたい場合です。

最初のケースでは、Mono Migration Analyzerツール(Moma)を使用して、アプリケーションがMonoで実行されていない距離を評価できます。評価が飛んでいる色で戻ってきた場合は、テストとQAを開始して、出荷の準備をする必要があります。

評価の結果、Mono のセマンティクスに欠落している機能や大きく異なる機能が強調されたレポートが返ってきた場合、コードを適応させるか、書き換えるか、最悪の場合、アプリケーションが機能を減らしても動作するかどうかを評価しなければなりません。

ユーザーからの投稿に基づく Moma の統計によると(これは記憶にあるものです)、約 50% のアプリケーションは箱から出してすぐに動作し、約 25% は約 1 週間の作業(リファクタリング、適応)を必要とし、残りの 15% はコードの塊をやり直すことに真剣に取り組む必要があります。その時点では、ゼロから始めるか、ビジネス上の決断でコードを移植する努力をするかのどちらかになりますが、数ヶ月分の作業が必要になります(少なくとも私たちが持っているレポートでは)。

ゼロから始める場合は、Mono に存在する API のみを使用することになるので、状況ははるかに単純です。サポートされているスタック(.NET 2.0 を中心に、LINQ や System.Core を含む 3.5 のすべてのコアアップグレードと Mono のクロスプラットフォーム API を含む)を使用していれば問題ありません。

たまにMonoのバグや制限に遭遇することがあり、それを回避しなければならないことがありますが、それは他のシステムと変わりません。

移植性に関しては、ASP.NETアプリケーションの方が移植しやすいです。ASP.NETアプリケーションは、Win32への依存度がほとんどないため移植が容易で、SQLサーバーやその他の一般的なデータベースを使用することもできます(Monoには多くのデータベースプロバイダがバンドルされています)。

Windows.Forms の移植は時々厄介です。開発者は .NET のサンドボックスから抜け出して、P/Invoke で頭脳を働かせて、カーソルの点滅率を変更するような有用なものを設定するのが好きなので、wParam で BCD 形式でエンコードされた 2 つのベジエポイントで表現されます。またはそのようなジャンクなもの。




Answer 2 Jon Galloway


.NET 4.0まではかなり広範囲にカバーしており、.NET 4.5 APIの機能もいくつか含まれていますが、APIが非推奨になったり、新しい代替案が作成されたり、スコープが大きすぎたりするため、実装しないことを選択した分野がいくつかあります。以下のAPIはMonoでは利用できません。

  • ウィンドウズプレゼンテーションファウンデーション
  • Windows Workflow Foundation (2つのバージョンのどちらでもない)
  • エンティティフレームワーク
  • 標準的なWebサービススタックへのWSE1/WSE2の "アドオン"

さらに、私たちのWCFの実装はSilverlightがサポートしているものに限定されています。

特定のプロジェクトを確認する最も簡単な方法は、Mono Migration Analyzer(MoMA)を実行することです。利点は、Monoチームに問題を通知することです。これにより、Mono(存在する場合)を使用できなくなり、作業に優先順位を付けることができます。

最近、SubSonicでMoMAを実行してみたところ、1つだけ問題が見つかりました-Nullable型の奇妙な使い方です。それは、Nullable 型の奇妙な使用です。これは大きなコードベースなので、そこでのカバレッジはかなり印象的でした。

Monoは、いくつかの商用製品およびオープンソース製品で積極的に使用されています。ウィキペディアやMozillaDeveloper Centerなどの一部の大規模なアプリケーションで使用されており、Sansa MP3プレーヤーなどの組み込みアプリケーションで使用されており、公開されている何千ものゲームに電力を供給しています。

言語レベルでは、MonoコンパイラはC#5.0言語仕様に完全に準拠しています。




Answer 3 FlySwat


デスクトップ側では、Mono は GTK#を使うことにコミットしていれば、素晴らしい動作をしてくれます。Windows.Formsの実装はまだ少しバグがあるが(例えばTrayIconが動かないなど)、だいぶ進歩している。また、GTK#はWindows.Formsよりも優れたツールキットです。

ウェブ側では、MonoはASP.NETを十分に実装しているので、ほとんどのサイトを完璧に動作させることができます。ここで難しいのは、apacheにmod_monoがインストールされているホストを見つけるか、ホストにシェルアクセスできる場合は自分でやるか、ということです。

どちらにしても、モノは素晴らしいし、安定しています。

クロスプラットフォームプログラムを作成する際に覚えておきたいポイント

  • Windows.Formsの代わりにGTK#を使用する
  • ファイル名の大文字と小文字を適切に区別してください。
  • 使用 Path.Separator の代わりにハードコーディング "\" 、また使用 Environment.NewLine の代わりに "\n"
  • Win32 API への P/Invoked 呼び出しは使用しないでください。
  • Windowsレジストリを使用しないでください。



Answer 4 damageboy


個人的には、ゴールデンタイムの環境で Mono を使用しています。私は、ギガバイトのUDP/TCPデータ処理関連のタスクを扱うMonoサーバーを運用していますが、これ以上の喜びはありません。

クセがありますが、最も厄介なのは、Monoの現状のためにmsbuildファイルを「ビルド」することができないことです。

  • MonoDevelop (IDE)は部分的に msbuild をサポートしていますが、基本的には単純なhello-world (カスタムビルドタスク、$(SolutionDir)のような動的な「プロパティ」、実際の設定などの行き詰まり)を超えた「リアルな」ビルドコンフィグでは動作しません。
  • モノサプライのmsbuild-fully-compatible-build-systemである必要があるxbuild はさらに恐ろしいため、コマンドラインからのビルドは、GUIを使用するよりも実際には悪い経験です。これは非常に「非正統的な」状態です。 Linux環境のユニオン...

一度/実際にBUILTしてみると、サポートされるべきコードであっても、荒野を見ることがあるかもしれません。

  • コンパイラが特定の構造体で動作しなくなること
  • そして、より高度で新しい .NET クラスが予想外のクソを投げつけてきます (XLinq 誰か?)。
  • いくつかの未熟なランタイム "機能" (x64 での 3GB ヒープ制限...WTF!)

しかし、一般的に言えば、物事は非常に迅速に機能し始め、解決策/回避策は豊富であるとヒービングは言いました

あなたがそれらの最初のハードルを乗り越えたら、私の経験はそのモノロックであり、すべての反復で良くなり続けます

私は、モノラルでサーバーを動かし、1日あたり300GBのデータを処理し、大量のp/invokesと一般的に言えばLOTSの仕事をして、"ブリーディングエッジ "のモノラルでも5-6ヶ月間稼働させていました。

これが助けになることを願っています。




Answer 5 Kris Erickson


合格した答案の推薦は、今となっては少し時代遅れになっています。

  • Windowsフォームの実装は今ではかなり良いです。(かなり複雑なWindowsフォームアプリケーションであるPaint.netのポートについては、Paint-Monoを参照してください。必要なのは、一部のP-Invokeおよびサポートされていないシステムコールのエミュレーションレイヤーだけでした)。
  • パスとファイル名を結合するには、Path.Combine と同様に Path.Seperator を使用します。
  • windowsのレジストリは、アプリケーションのデータを保存したり取得したりするためだけに使うのであれば問題ありません(つまり、基本的にはMonoアプリケーションのレジストリなので、そこからWindowsの情報を得ることはできません)。