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