C# VB.NETなどの.Net環境から、
C,C++等で作られたネイティブの資産を利用するには
大きく分けて2つの方法があります。
- ネイティブ環境用につくられたDLLファイルを通して、
ネイティブの関数を直接呼び出す方法(P/Invoke)。 - マネージ、アンマネージ両方を同時に扱える言語C++/CLIを用いて、
内側はアンマネージドで処理し、外側からはマネージドに見えるような
ラッパーライブラリを作る方法。
双方の特徴を思いつく範囲で上げて見ました。
P/Invoke(DLLImport)
- このDLLの形で公開されているライブラリは多く、
この方法で呼び出しているラッパーライブラリが公開されている場合も多い - ヘッダファイルの内容(関数のプロトタイプ宣言、構造体の宣言)を.NET 風に書き直す必要がある。
- マネージドコードから、直接ネイティブ関数を呼び出すので
マネージド型とアンマネージド型で直接やり取りを行う。
アンマネージド関数に、マネージドオブジェクトを渡すことになり、
呼び出しコスト、及び、オブジェクトの変換コストが掛かる。 - 関数の宣言や、オブジェクトの変換規則(マーシャリング)を覚える必要がある
- 関数の種類によってはメモリ破壊などが発生する可能性がある。
- クラス(非staticなメンバ関数)が使えない
- DLL自体の修正は難しいが、適応は楽
C++/CLI
実際のやり取りはアンマネージドオブジェクトどうしで行うためコストが少ない。
すべてのクラス、すべての関数をラップする必要がある
P/Invokeでは、実行時コストが大きく、マネージ、アンマネージ間で直接やり取りを行うが故の制限なども多いため
.NETからネイティブコードを呼びだすためのライブラリを新たに作る必要がある場合は
C++/CLIをお勧めします。
COMでもネイティブコードが使えることに気づいた
COMは正直よく知らないので省略
Office関連やWinRTで使われてるらしい。