0

現在、VC6から2005に変換した巨大なプロジェクトがあります。次に、一部の機能の新しいフロントエンドを作成したいと思いますが、プログラムのメインロジックはc++に基づいています。また、コードベースは、独自のメタタイプと特注のクラスを中心に展開しています。

私が思いつくことができる最善の解決策は、C++プロジェクトのdllから関数を呼び出すことです。ただし、これは、データがc ++とc#の間の境界を越える巨大なデータマーシャリング投資につながります。他に選択肢があるかどうか疑問に思いました(完全な書き直しはオプションではありません)。

ありがとうリッチ

4

2 に答える 2

1

ネイティブDLLのマネージフロントエンドを作成する場合は、データをマーシャリングする必要があります。この問題を回避する方法は実際にはありません。

現在、現在のプロジェクトの1つで同様の問題に直面しています。私たちが採用したアプローチは、PInvokeを使用してManaged->Nativeと話すことです。いくつかの例外を除いて、CLRはメモリコピーとして実装できるため、マーシャリングのコストを削減するのに役立つBlittableタイプのみをPInvokeします。

ネイティブ->管理対象と通信する場合、COMオブジェクトを使用します。blittableに関しても同じルールを適用しようとしますが、このシナリオでは、blittableを防ぐために多くのCOMオブジェクトを含める必要があることがよくあります。

このアプローチを取ることは私たちから非常にうまくいきました。データマーシャリング用に定義されたプリミティブを取得するために、少し時間を費やしました。しかしその後、マーシャリングは...より良い言葉がないために日常的になりました。オーバーヘッドですが、完全に書き直すよりもはるかに安価です。

于 2009-04-01T14:24:05.873 に答える
0

以前は C++/CLI (以前はマネージド C++ と呼ばれていました) を使用して相互運用を処理していました。既に C++ を使用している場合は、P/Invoke よりも優れたオプションになる可能性があります。多くの相互運用機能は「問題なく動作」し、気になる場合もあれば気にならない場合もある複雑なランタイム バインディングの代わりに、コンパイル時の安全性が得られます。

于 2009-04-01T15:17:39.987 に答える