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