より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

What's Interop? それは相互運用

C#とアンマネージドなC++のコードの間の値の受け渡しをするための仕組みがInterop。相互運用になります。

C#を扱うものとしては理解しておきたいので、これを機会に実際に手を動かして勉強することにしました。

docs.microsoft.com

docs.microsoft.com

特に以下のサイトが参考になります。

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

恒例のトラブルシューティング

f:id:rimever:20191208192543p:plain

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は非対応にしたいところですね。

docs.microsoft.com