0

そこで、実験として、C# で D DLL を使用できるかどうかを調べてみることにしました。私は少しグーグルをして、このスレッドを見つけました。DStringC# の 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)

何が起こっているのか、どうすれば修正できるのか、誰かが光を当てることができますか?

4

0 に答える 0