我的 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# 中做到这一点?有没有更好的方法来协调名称?