C#コードからアンマネージC++ライブラリを呼びたいと思います。どのような潜在的な落とし穴や予防措置を取る必要がありますか?あなたの時間をありがとう。Visual Studioを使用してWindowsでC#コードとumanaged C++コードを混ぜる
答えて
この質問は広すぎます。合理的な唯一の答えはP/Invokeですが、Windows用にプログラムを作成する場合は、Win32 APIを知っておく必要があると言っているようなものです。
P/Invoke(http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X)について書かれた本のほとんどは、http://www.pinvoke.net/です。
これと一緒に行くことができるルートがいくつかあります。管理されていないC++ライブラリを更新してC++拡張ラッパーを管理し、C#でそれらのクラスを直接利用するようにできます。これは少し時間がかかりますが、レガシーアンマネージドコードとの良いつながりを提供します。しかし、管理されたC++の拡張機能は、シンタックスがアンマネージドC++に似ていますが、非常に熟練した目でその違いを見ることができるほど近いため、時にはナビゲートするのが難しいことに注意してください。
あなたの校正されたC++にはCOMクラスが実装されており、C#で自動生成された相互運用アセンブリを使用する必要があります。 COMの周りにあなたのやり方が十分分かっていれば、この方法は簡単です。
これが役に立ちます。
P/Invokeを使用してアンマネージコードを呼び出すこともできます。あなたのコードが現在COMを使用していない場合、これは簡単かもしれません。私はおそらく、あなたがこのルートに行った場合、 "C"バインディングを使ってあなたのコードにいくつかの特定のエクスポートポイントを書く必要があると思います。
あなたが私の経験で注意しなければならない最大のものは、決定論的なガベージコレクションがないということは、あなたが以前に思っていたときにデストラクタが動作しないということです。これを念頭に置いて、IDisposableやその他の方法を使用して、必要なときにマネージコードがクリーンアップされるようにする必要があります。
P/Invokeについて説明しています。これは、C++ライブラリがDLLインターフェイスを介して自身を公開する必要があることを意味し、インターフェイスは呼び出し属性を介してP/Invokeに記述するのに十分シンプルである必要があります。マネージコードが管理されていない世界を呼び出すときは、パラメータをマーシャリングしなければならないため、わずかなパフォーマンスの低下が見られるかもしれませんが、マーシャリングが重要かどうかを確認するためにいくつかのテストを行う必要があります。
外部エントリーポイントを持つDLLとしてコードをパッケージ化した場合はもちろん、そこには常にPInvokeがあります。どのオプションも痛みのないものはありません。それらは、a)COMまたはManaged Cラッパーの作成におけるスキルb)PInvokeでのあなたの腕のチャンス。
最も簡単な方法は、すべてのC++機能が「C」スタイルの関数として公開されていることを確認することです。関数を_stdcallとして宣言してください。
にextern "C" __declspec(のdllexport)int型_stdcallはFoo(int型A)
あなたは特に、物事のポインタのように、マーシャリング権を取得していることを確認してください&はwchar_t *。間違っていると、デバッグするのが難しいかもしれません。
いずれかの側からデバッグしますが、両方からデバッグしないでください。混合ネイティブ&をデバッグすると、デバッガは非常に遅くなることがあります。一度に1つの側をデバッグすると、多くの時間を節約できます。
より具体的にするには、より具体的な質問が必要です。
私はswigを見ていますが、私たちはC++ APIを他の言語プラットフォームに公開するプロジェクトに効果的です。
これは、C#などの言語がネイティブコードと直接通信できるようにする、C++ライブラリの周りに薄いラッパーを効果的に構築するプロジェクトで、グルーコードを実装(およびデバッグ)する必要がありません。
良いPInvokeの例をご希望の場合は、PInvoke.netをご覧ください。これには、win API関数のほとんどを呼び出す方法の例があります。
また、この記事のツールClr Inside Out: PInvokeを使用して、.hファイルをc#ラッパーに変換することもできます。
__dll_exportsを使用しているWin32 DLLではP/Invokeが動作しませんか? –