1

C++ プロジェクトに、エクスポートしたい関数があります。

extern "C" __declspec(dllexport) bool __stdcall DoExport(wchar_t* dataSource)

C# で DllImport 属性を使用してインポートすると、正常に動作します。

[DllImport(@"mydll", CallingConvention=CallingConvention.StdCall, 
    CharSet=CharSet.Unicode)]
private static extern bool DoExport(string dataSource);

実行時にdllへのパスを取得していて、残念ながら相対パスも使用できないため、dllを明示的にロードする必要があります。だから私はそれを次のように呼びます:

var dllPath = ResolveDllPath();
var libraryHandle = LoadLibraryEx(dllPath, IntPtr.Zero, 
    LOAD_WITH_ALTERED_SEARCH_PATH);

if (libraryHandle != IntPtr.Zero)
{
    var procAddress = GetProcAddress(libraryHandle, "DoExport");
    if (procAddress != IntPtr.Zero) // here I'm getting 0 address.
    {
        ...

GetProcAddress は 0 を返します。dumpbin.exe を使用して dll エクスポートを収集し、次の名前の関数を見つけました。_DoExport@20

したがって、この装飾された名前を引数として渡すと正しいアドレスが取得されるため、関数を取得するには __stdcall 規則を指定する必要があるようです。

C#でこれを行うにはどうすればよいですか? 名前を調整するより良い方法はありますか?

4

0 に答える 0