C# プロジェクトを作成し、既存のネイティブ (C++) コードを実装したいと考えています。誰かがそれについての良いチュートリアルを知っていますか?
ありがとう!
C# プロジェクトを作成し、既存のネイティブ (C++) コードを実装したいと考えています。誰かがそれについての良いチュートリアルを知っていますか?
ありがとう!
既存のコードを実装することで、C ++コードに最小限の変更を加えて、C#から呼び出したいと思います。
私はファンであり、オンラインで役立つサンプルの章がいくつかあるC ++ / CLIinActionという本を最近購入しました。
このCodeProjectの紹介は、良い出発点です。
C ++ / CLI in Actionの作成者は、CodeProjectに関する多数の記事を持っています。彼の索引のC ++/CLIセクションまでスクロールダウンしてください。
P / Invokeに関するウィキペディアの記事には、そのアプローチを使用したくない理由がいくつかありますが、私はそれに同意します。
MSDNの最適な出発点は、要約記事です。
あなたのC++コードが管理されている場合(あなたが言うように)、非常に正当な理由がない限り、C++のままにしておくことをお勧めします-将来のC#(など)アセンブリはそれをそのまま参照できるようにする必要があります'。
C++ コードのマネージ ラッパーを試してみませんか。
おそらくこれを行う最も簡単な方法は、C++/CLI プロジェクトを作成することです。これにより、マネージド C++ とアンマネージド C++ を混在させることができます。次に、既存のアンマネージド C++ クラスをマネージド .Net ラッパーでラップして、C# コードから直接呼び出すことができます。MSDN マガジンには、C++/CLI に関する優れた紹介記事があります。
相互運用性は、C スタイルの関数を呼び出す場合にのみ役立ちます。純粋な C++ クラスと対話するために実際に使用することはできません。
私はこれを実践して学んだので、良いチュートリアルはありませんが、注意する必要があることがいくつかあります。マネージ C++ と C++/CLI は両方とも、アンマネージ コードと統合され、醜い継ぎ目がほとんどありません。これは C# には当てはまりません。マネージ C++ では、次のようなことがかなり可能です。
dotNetForm->Text = S"My Project"; // regular managed code
::SetWindowText(dotNetForm->Handle, "Your Project"); // mixed managed/unmanaged
一方、C# では、SetWindowText に P/Invoke する必要がありますが、実際にはそうではありません。これは単純な例ですが、マネージ C++ コンパイラは、多くの相互運用を透過的に実行するという奇妙な組み合わせであることに注意する必要があります。同時に何もしません (つまり、暗黙的なマーシャリングは行いません)。