从C ++ dll导出函数到在C#项目中显式链接它的好方法是什么

时间:2013-06-07 17:29:08

标签: c# c++ dllimport dllexport

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

0 个答案:

没有答案