マネージ C++ を使用して、いくつかのレガシー C++ ライブラリ用の .Net 呼び出し可能なラッパーを作成することを検討しています。
それはすべて非常に簡単に見えます。何か気をつけることはありますか?
マネージ C++ を使用して、いくつかのレガシー C++ ライブラリ用の .Net 呼び出し可能なラッパーを作成することを検討しています。
それはすべて非常に簡単に見えます。何か気をつけることはありますか?
C++/CLI でいくつかの既存の C++ ライブラリをラップするのは一般的に非常に簡単であり、落とし穴も比較的少ないことがわかりました。私が覚えているのは次のとおりです。
それはかなり簡単で、うまく機能します。PInvoke よりもはるかに簡単です。
注意する必要がある大きなことは、プライベート メンバー、メソッド シグネチャなどを含む、マネージド ヘッダーにアンマネージド メンバーがないことです。ただし、マネージド型へのポインターであるプライベート メンバーを使用しても問題ありません。クラス。
また、オブジェクトの有効期間にも注意してください。多くの .NET プログラマは自分でクリーンアップすることに慣れていないため、メモリ リークが発生しやすくなります。作成するラッパー クラスにポインターが含まれている場合は破棄可能であることを確認し、マネージ コードで破棄するようにしてください。マネージ C++ での IDisposable の構文も奇妙ですが、ドキュメントに記載されています。
また、管理対象/非管理対象の境界を越えるたびにわずかなヒットが発生することを忘れないでください。したがって、それに応じてインターフェイスを計画してください。ループ内で何かが繰り返し呼び出される場合は、そのループを境界を越えて移動して、境界を 1 回だけ越えた方がよいでしょう。ただし、何百万もの通話を話している場合を除き、これについてあまり心配する必要はありません。
この記事は逆になりますが、役立つ点がいくつかあります。
ManWrap ライブラリを使用して、ネイティブ C++ コードで .NET を最大限に活用する
こちらもご覧ください
私たちが遭遇したいくつかの問題:
みんなが言ったことに付け加えるけど、
pin_ptr wch = PtrToStringChars(文字列); (string は System::String です)
あなたの友達になります。
非マネージド クラスをマネージド クラスに直接含めることはできませんが、アンマネージド クラスへのポインターを配置し、コンストラクターでそれを新規作成し、デストラクターで削除することはできます。
私は、C++ と C++/CLI コードを 1 つの DLL に混在させることに関して、Timo Geusch が言及した問題を経験していません。私の DLL は問題なく両方を広範囲に使用しています。
C++/CLI は (C++ と .NET の知識があれば) 難しくなく、うまく機能します。
他の人が言ったように: 98% の確率で動作し、デバッグ可能で、高速です。
これまでに言及した以上に遭遇したこと:
C++ コードで単体テストを実行するための C++/CLI コードを書き始めたほど、うまく機能することさえありました。NUnit/Resharper は、C++/CLI DLL でユニット テストを喜んで見つけて実行します。これにより、任意のレベルでネイティブ コードを直接呼び出すことができ、テンプレート コンテナー クラスをテストすることさえできます。