そこで、実験として、C# で D DLL を使用できるかどうかを調べてみることにしました。私は少しグーグルをして、このスレッドを見つけました。DString
C# の 4 回目の投稿でクラスに指定されたコードをコピー (C&P ではなく入力) し、 hereの DllMain() コードを使用しました。
私のDコード:
// dllmain.d
import std.c.windows.windows;
import core.sys.windows.dll;
__gshared HINSTANCE g_hInst;
extern (Windows) {
BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved) {
switch (ulReason)
{
case DLL_PROCESS_ATTACH:
g_hInst = hInstance;
dll_process_attach(hInstance, true);
break;
case DLL_PROCESS_DETACH:
dll_process_detach(hInstance, true);
break;
case DLL_THREAD_ATTACH:
dll_thread_attach(true, true);
break;
case DLL_THREAD_DETACH:
dll_thread_detach(true, true);
break;
}
return true;
}
}
そして、C# でインポートしている実際の関数:
// hello.d
module sbned;
import std.string;
export extern(C) {
ref string helloWorld() {
return "Hello World!"; }
}
関数 helloWorld() を次のようにインポートします。
[DllImport("sbned.dll")]
[return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(DString))]
public static extern string helloWorld();
それはすべて正常にコンパイルされ、D または C# コンパイラからのエラーはありませんが、プログラムを (デバッガーの有無にかかわらず) 実行しようとすると、クラッシュします。デバッガーを使用すると、次のエラーが表示されます。
BadImageFormatException was unhandled
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
何が起こっているのか、どうすれば修正できるのか、誰かが光を当てることができますか?