6

私は、C++ ライブラリを .NET プロジェクトに統合することを目指している通常の .NET 開発者です。私にはいくつかのアイデアがありますが、一般的に C++ は初めてなので、使用しようとしているテクノロジの限界がわかりません。C++ プロジェクトは基本的に、さまざまなポストプロセッシング トリックを使用してマルチトラック オーディオ ファイルを再生できる高速サウンド レンダラーです。これはすべて素晴らしいことですが、統合したい単純な .NET WinForms アプリがあることを考えると、物事が乱雑に見え始めます。

  1. まず、C++ プロジェクトには .NET バインディングも ActiveX/COM 統合もありません。その単純な 'ol MS VC++ 9 プロジェクトです。.NET アプリでプロジェクトを操作する場合は、何らかの方法でそれとやり取りする必要があります。クラス インスタンスの作成、プロパティの設定、メソッドの呼び出し、データの入出力のマーシャリングなど。

  2. 次に、独立した Windows アプリとして実行するように構築され、MS Windows API を使用して独自のウィンドウを管理します。これで問題ありませんが、どういうわけか、.NET VMをバックグラウンドで実行し、ショーを管理し、すべての C# コードを実行する必要があります。私は C++ を書いていないので、このライブラリを中心にアプリを構築するには C# に固執する必要があります。

  3. 第 3 に、C++ ライブラリと同じプロセスで実行しているかどうかに関係なく、これら 2 つの個別のアプリを 1 つのアプリのようにビルド/インターフェイス/デバッグする方法が必要です。高性能データ操作用の C++ DLL をいくつか作成したことを除いて、C++ プログラミングのバックグラウンドはありません。

それで、多くの質問と開始方法がわかりません!

  • この lib を完全にコンパイルして VC EXE に入れることはできますが、.NET コードを一緒にコンパイルするにはどうすればよいですか? あるいは、C++ コードを .NET EXE にコンパイルして、管理された環境で実行するにはどうすればよいですか? このために設計されたものではないことに注意してください。あまり変更しようとすると、誤動作する可能性があります。

  • 主な問題は、それとのインターフェースです。一部の C++ クラスを .NET からアクセスできるように公開するにはどうすればよいですか? 私は必要なクラスを正確に知っており、.NET から利用できるようにするために必要なクラスは、関連するメソッド/プロパティと共に数十個だけです。.NET VM が前後に転送されるバイトのクラス構造を理解できるように、.NET でラッパー クラスを手書きしてもかまいません。コードのほとんどを .NET に残すことができるように、管理された環境から C++ オブジェクトを直接操作できることを願っています。

  • 独立したアプリとして実行したとしても、それと通信するためにソケットなどに頼る必要がありますか? これは絶対に最悪のケースであり、これを回避するために何でもします。

助けや指針をいただければ幸いです。自分自身と目の前のタスクを明確にし、質問が十分に具体的で回答可能であることを願っています。助けてくれてありがとう!

編集:ラッパー クラスを記述または生成する場合、P/Invokeを使用してクラス インスタンスを作成し、それらのメソッドを呼び出して、バックグラウンドでネイティブ C++ コードを実行させることはできますか? そのような C++ オブジェクトのメモリはどこに保存され、管理されますか? .NET ヒープ内か外部か?

4

2 に答える 2

3

オプション1

アンマネージド C++ オブジェクトを使用する場合は、C++/CLI でマネージド ラッパーを作成することをお勧めします。このラッパーは、ラップするクラスと同じインターフェイスを持ちますが、アンマネージド リソースをクリーンアップするためのマネージド コンストラクターとデストラクタを備えています。C++/CLI では、自分で削除する必要がある C++ と同じようにアンマネージド オブジェクトを作成するか、gcnew キーワードを使用してマネージド オブジェクトを作成できます。ラッパーの .NET 側は、マネージド オブジェクトを受け取ります。ラッパーのネイティブ側は、既に持っているすべての管理されていないデータ型を操作できます。

たとえば、アンマネージ クラスを考えてみFrobberます。C++/CLI では、ManagedFrobberと同じメソッドをすべて持ちFrobber、 のプライベート インスタンスを含む というクラスを作成しますFrobber。コンストラクターで、ManagedFrobberプライベートFrobberインスタンスを作成します。デストラクタではManagedFrobber、プライベートFrobberインスタンスを削除します。Frobberマネージド ラッパー クラスのすべてのメソッドは、単純にプライベートインスタンスのメソッドを呼び出します。

オプション 2

C++ の世界から呼び出すつもりのすべてが c スタイルの関数 (C# の意味では静的だと思います) である場合は、P/Invoke がおそらく最適な方法です。ラッパークラス。たとえば、ラッパー クラスを使用してマネージド ワールドからアンマネージド ワールドに配列を渡す場合、マネージド ワールドが .NET ランタイムによって移動されないように、配列を所定の位置に固定するなどのことを考慮する必要があります。それをいじっています。P/Invoke を使用すると、これらのニュアンスのほとんどが処理されます。

于 2013-03-18T22:33:29.530 に答える
3

マネージ C++ (C++/CLI) ラッパーをアンマネージ C++ コードに記述できます。これは最も柔軟なソリューションです。基本的に、C++ で .NET アセンブリを記述します。アセンブリは、アンマネージ コードを呼び出すマネージ クラスを公開します。その後、C# プロジェクトからこのアセンブリを参照できます。

その方法についての非常に基本的な記事があります: http://www.windowsdevcenter.com/pub/a/dotnet/2004/03/29/mcpp_part3.html

これも役立つかもしれません: http://www.multicoreconsulting.co.uk/blog/c-snippets/how-to-call-unmanaged-cplusplus-from-csharp/

MSDN の記事.NET Programming in Visual C++

于 2013-03-18T22:36:52.843 に答える