因此,作为一个实验,我决定尝试找出是否可以在 C# 中使用 D DLL。我做了一些谷歌搜索,找到了这个线程。我复制(键入,而不是 C&P)在 C# 的第 4 篇文章中为该类提供的代码DString
,并使用此处的 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)
任何人都可以了解正在发生的事情,以及我该如何解决它?