2009-04-01 11 views
0

私は最近VC6から2005に変換した巨大なプロジェクトを持っています。今ではいくつかの機能のために新しいフロントエンドを作成したいと思いますが、プログラムの主なロジックはC++に基づいています。また、コードベースは、独自のメタタイプや個別クラスを中心に展開しています。C++プロジェクトを.NETに変換/呼び出しするにはどうすればいいですか?

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

おかげ リッチ

+0

C + +でフロントエンドを書いているのはオプションではなく、単純にするだけですか? –

+0

既存のフロントエンドはすでにC++になっていますが、.Netインターフェイスが必要なので、新しいフロントエンドGUI機能を開発してWebServicesの入り口を開くことができます。 – Rich

答えて

1

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

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

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

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

0

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

関連する問題