私のアプリケーションは管理されていません。マネージ コードの導入はどこから始めればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/1922954

質問

私のアプリケーション全体 (実行可能ファイルが 20MB あるかなり大きい) はアンマネージ C++ で書かれています。マネージド コードを使用する利点が明確にわかったので、アプリケーションにマネージド コードの導入を開始したいと考えていますが、どこから始めればよいでしょうか?

C++/CLI の使用を簡単に開始して、アプリケーションの残りの部分とリンクできますか?(ただし、C++/CLI 構文はかなり「エキゾチック」に見えます)。

それとも、C# に移行する方が良いでしょうか。しかし、これをアンマネージド C++ コードと「リンク」する最善の方法は何ですか?

すべての C++ コードを /clr オプションを使用してコンパイルすることに意味はありますか?これはうまくいきますか?

マーシャリングについて心配する必要はありますか?これによりオーバーヘッドが発生しますか、それともパフォーマンスを低下させることなくマネージドとアンマネージドを切り替えることができますか (20 年前に Fortran と C を混合したときに行ったように)。私のアプリケーションは時々数ギガバイトのメモリを処理する科学アプリケーションであるため、パフォーマンスは非常に重要です。

それとも、ユーザー インターフェイスを再設計し、これのみを C# で記述し、アプリケーションの残りの部分 (計算ロジック、ビジネス ロジック、データベース インターフェイスなど) をアンマネージ C++ で維持することだけが意味があるのでしょうか?

私のアプリケーションは時々数ギガバイトのメモリを処理する必要があるため、64 ビット版を使用しています。64 ビットのマネージ コードを使用するのは簡単ですか?それだけのメモリが使用されている場合でも、ガベージ コレクターは効率的でしょうか?

単純に次のように述べます。どこから始めればいいですか?

パトリック

役に立ちましたか?

解決 3

現時点では、この質問は終了したと考えてください。

答えは C++ と C# を混ぜることではなく、そもそもアーキテクチャを正しく理解することであることに気づきました。

アーキテクチャが正しく、分離する必要がある箇所で分離されていれば、他のモジュール (外部、他の言語など) によってアプリケーションの一部を変更するよりも簡単になるはずです。

マーシャリング時のパフォーマンスの問題については、.Net がさらに成熟するまで待つ必要があります。

他のヒント

アプリをプロファイリングし、どの統合ポイントで C# のロジック ラインを切り離して C++ に中断できるか (またはその逆) を決定します。これらを計画にまとめて、ファサード デザイン パターンがシステム内を移動し、C++ が C# に徐々に置き換えられるようにします。主な懸念事項は、候補となる各ファサード/インターフェイスで言語を切り替えることを決定する際の CPU とメモリのコストです。

編集を組み込めるようにする必要があるため、元の C++ コード用に 1 つのソース コード セットとソース コード リポジトリを使用し、ファサードと C# 用に別のセットとリポジトリを使用するのが最適です。

次に、拡張/メンテナンス作業がトレイ内で行われると、それを両方のコード ベースに適用し、変更作業の 2 倍を最小限に抑えるために、拡張またはメンテナンスで変更される可能性が最も低いコードから始めてファサードがシステム内を移動するようにします。 。

また、問題が発生した場合にファサードをロールバックしてすぐに 100% C++ に戻せるように、作業を構造化するのが理想的です。

いくつかの特に不可解な C++ モジュールを C++ 部分と C# 部分に分離できるかどうかをテストするには、パイプまたはソケットを使用して通信する 2 つの異なる Win32 C++ プロセスでそれらを実行します。こうすることで、その時点で呼び出しチェーンを分割する前に、修正が必要なメモリ管理やパフォーマンスの問題があるかどうかをよりよく把握できるようになります。

私たちは、何千人ものユーザーが使用するミッションクリティカルなアプリケーションで、まさにあなたが説明したことを実行します。基本的に、既存のアプリケーションをそのまま維持したため、実行可能ファイルは依然として 100% アンマネージド実行可能ファイル (C++/CLI ではない) です。次に、新しい C# コードをすべて、ビジネス オブジェクト、ユーザー コントロール、GUI コードなどで構成される .NET DLL に配置します。

基本的に、新しいコードはすべて C# で記述されます。C++/CLI の単なる接着剤である dll が 1 つあります。これにより、既存の C++ コードを clr にすることなく、マネージド コードとアンマネージド コードの間で簡単に相互運用できるようになります。これにより、記述しなければならない C++/CLI コードの量が制限されます。ネイティブ コードは混合モード コードと通信し、混合モード コードはマネージド コードと通信できます。混合モード DLL は C# クラスにイベントをフックできるため、C# コードはイベントを起動して C++/CLI (ネイティブ コードと通信できる) と通信することができます。

既存の C++ アプリで .NET UserControl をホストすることもできます (WinForms はいずれにしても WINAPI のラッパーにすぎないため、非常にうまく機能します)。

これは非常にうまく機能し、C# で GUI 全体を書き直すことなく、既存のコードを維持できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top