0

因此,作为一个实验,我决定尝试找出是否可以在 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)

任何人都可以了解正在发生的事情,以及我该如何解决它?

4

0 回答 0