我已经阅读了几个与我有关的问题,但没有多个答案为我工作。
我需要从一个非托pipeDLL调用一个函数。 我在SysWow64有32位版本的DLL,而在System32有64位版本。 无论如何,我正在编译x86。 我没有DLL的源代码,所以用extern“C”重新编译不是一个选项。
DLL的包含文件的相关部分:
(...) #include <string> namespace SomeNamespace { (...) typedef std::wstring STRING; (...) class SomeClass { (...) static bool SomeFunc(const STRING& p1, bool p2); (...) } }
当调用SomeFunc时,我收到一个exception:“找不到名为'?'的入口点 在DllName.dll“(翻译是我的,可能是不精确的)。
我在C#中的声明:
[System.Runtime.InteropServices.DllImport("DllName.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?SomeFunc@SomeClass@SomeNamespace@@SA_NABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N@Z")] bool SomeFunc(string p1, bool p2);
我也尝试了以下几点:
[System.Runtime.InteropServices.DllImport("DllName.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "#15")] bool SomeFunc(string p1, bool p2);
15是依据Depends的函数序号,第一版的EntryPoint也是从Depends中获得的。
根据undname.exe,这是该函数的原始声明:
public: static bool __cdecl SomeFunc(class ?? :: ?? ::Z::basic_string<wchar_t,str uct std::char_traits<wchar_t>,class w::allocator<wchar_t>,td,bool> const &, ?? ) throw( ?? )
它似乎没有正确parsing它; bool应该是FuncName的参数,而不是basic_string的types参数。 但是,我不确定这是否只是从undname.exe或更严重的东西parsing错误。
我该如何解决?
更新:当使用函数的序号作为入口点时,我没有得到一个exception。 我从窗体的Load事件调用这个,debugging时,我失去了控制权。 我的意思是,我正在使用SomeFunc()行上的光标进行debugging,我按F10,应用程序继续,因为如果我没有debugging。 我没有得到一个ThreadException或一个UnhandledException。
调用代码:
public bool CallSomeFunc() { try { SomeFunc("p1", true); } catch (Exception ex) { ex.ToString(); // I just use this to put a breakpoint while debugging. } return true; }
结束更新
您需要将C ++ / CLI作为包装从C ++类中调用方法。 PInvoke仅适用于全局导出函数。
查看本地C ++的C ++ / CLI包装器,以用作C#中的参考 。