我的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#中执行此操作?是否有更好的方法来协调名称?