6

C# コードからアンマネージ C++ ライブラリを呼び出したいと考えています。潜在的な落とし穴と取るべき予防策は何ですか? お時間をいただきありがとうございます。

4

8 に答える 8

3

これにはいくつかの方法があります。1 つは、アンマネージ C++ ライブラリを更新してマネージ C++ 拡張機能ラッパーをそれらの周りに配置し、C# でそれらのクラスを直接利用できるようにすることです。これには少し時間がかかりますが、従来のアンマネージ コードへの適切な橋渡しとなります。ただし、マネージド C++ 拡張機能は、構文がアンマネージド C++ に似ているため、それ自体をナビゲートするのが少し難しい場合があることに注意してください。

もう 1 つの方法は、管理されていない C++ に COM クラスを実装させ、自動生成された相互運用機能アセンブリを介して C# にそれを利用させることです。COM の使い方を十分に知っていれば、この方法は簡単です。

お役に立てれば。

于 2008-09-16T20:33:14.830 に答える
1

開始する最も簡単な方法は、すべての C++ 機能が「C」スタイルの関数として公開されていることを確認することです。関数を _stdcall として宣言してください。

extern "C" __declspec(dllexport) int _stdcall Foo(int a)

特にポインターや wchar_t * などのマーシャリングを正しく行うようにしてください。間違えると、デバッグが困難になる可能性があります。

どちらか一方からデバッグしますが、両方ではありません。ネイティブとマネージドが混在するデバッグを行うと、デバッガーが非常に遅くなる可能性があります。一度に 1 つの側面をデバッグすると、多くの時間を節約できます。

より具体的にするには、より具体的な質問が必要になります。

于 2008-09-16T20:46:21.727 に答える
1

P/Invoke について説明しています。つまり、C++ ライブラリは DLL インターフェイスを介してそれ自体を公開する必要があり、インターフェイスは呼び出し属性を介して P/Invoke に記述できるほど単純である必要があります。マネージド コードがアンマネージド ワールドを呼び出す場合、パラメーターをマーシャリングする必要があるため、パフォーマンスがわずかに低下する可能性がありますが、マーシャリングが重要かどうかを確認するためにいくつかのテストを行う必要があります。

于 2008-09-16T20:40:22.333 に答える
1

この質問は広すぎます。唯一の合理的な答えは P/Invoke ですが、これは、Windows 用にプログラムしたい場合は Win32 API を知る必要があると言っているようなものです。

P/Invoke についてはほぼすべての本が書かれており ( http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X )、もちろん Web サイト全体も作成されています: http:// www.pinvoke.net/ .

于 2008-09-16T21:32:27.653 に答える
0

swigを見てみましょう。これを使用して、プロジェクトに効果をもたらし、C++APIを他の言語プラットフォームに公開します。

これは、C#などの言語がネイティブコードと直接通信できるようにするC ++ライブラリの薄いラッパーを効果的に構築する、手入れの行き届いたプロジェクトです。グルーコードを実装(およびデバッグ)する手間が省けます。

于 2008-09-16T21:00:21.677 に答える
0

優れたPInvokeの例が必要な場合は、PInvoke.netを参照してください。ほとんどのwinapi関数を呼び出す方法の例があります。

また、この記事のツールClr Inside Out:PInvokeを使用して、.hファイルをc#ラッパーに変換することもできます。

于 2008-09-16T21:13:06.450 に答える
0

もちろん、外部エントリポイントを使用してコードを DLL としてパッケージ化した場合は、常に PInvoke も存在します。どの選択肢も無痛ではありません。それらは、a) COM またはマネージ C ラッパーを作成するスキル、b) PInvoke で腕を振るうことのいずれかに依存します。

于 2008-09-16T20:44:32.900 に答える
0

P/Invoke を介してアンマネージ コードを呼び出すこともできます。コードで現在 COM を使用していない場合、これは簡単です。このルートに行った場合、「C」バインディングを使用してコードに特定のエクスポートポイントを記述する必要があると思います。

おそらく、私の経験上、最も気をつけなければならないことは、決定論的なガベージ コレクションがないということは、デストラクタが実行されると思っていたときに実行されないということです。これを念頭に置いて、IDisposable またはその他の方法を使用して、必要なときにマネージド コードが確実にクリーンアップされるようにする必要があります。

于 2008-09-16T20:39:28.967 に答える