C#とアンマネージドなC++のコードの間の値の受け渡しをするための仕組みがInterop。相互運用になります。
C#を扱うものとしては理解しておきたいので、これを機会に実際に手を動かして勉強することにしました。
特に以下のサイトが参考になります。
A Practical Tutorial on C# – C++ Interop using (mostly) Standard C++stephangarbin.wordpress.com
extern "C" LIBRARY_EXPORT int get_value(NativeObject* instance) { return instance->get_value(); }
internal class Wrapper { [DllImport("InteropLibrary.dll")] public static extern int get_value(IntPtr instance); }
dllファイル名を宣言して、その関数名を指定する。
そうすることで、C++のdllの関数をC#から呼び出せるようになります。
このDllImportはWin32APIを呼び出すのにも使えます。
BadImageFormatException
恒例のトラブルシューティング。
System.BadImageFormatException HResult=0x8007000B Message=間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外:0x8007000B) Source=ConsoleApplication スタック トレース: at ConsoleApplication.ManagedWrapper.new_NativeObject(Int32 value) at ConsoleApplication.ManagedObject..ctor(Int32 value) in C:\Work\Develop\TryInterop\ConsoleApplication\ManagedObject.cs:line 16 at ConsoleApplication.Program.Main(String[] args) in C:\Work\Develop\TryInterop\ConsoleApplication\Program.cs:line 13
64ビットと32ビットでは別扱いになることに注意です。
そのため、C++のライブラリは64ビットと32ビットをそれぞれ用意して、プラットフォームに応じて適切なdllをロードするようにする必要があります。
ややこしいので、32ビットPCは非対応にしたいところですね。