【发布时间】:2012-03-06 16:41:50
【问题描述】:
我终于有了一个完整的 C++ DLL,但我无法从 C# 调用它。肯定会找到 DLL,因为当我从文件夹中删除它时,我得到了一个不同的异常,“DLLNotFoundException”。完整的错误描述是“无法在 DLL 'CComms.dll' 中找到名为 'GetNewInstance' 的入口点”。这些函数都像这样在 C++ 中导出
__declspec(dllexport) DWORD __stdcall GetNewInstance();
我像这样从 C# 调用它
[DllImport("CComms.dll")]
private static extern uint GetNewInstance();
// ... and in main
uint inst = GetNewInstance();
当我使用“dumpbin /exports CComms.dll”时,我得到了一些奇怪的输出,我不确定函数名是否被破坏,这就是它找不到入口点的原因
7 6 00002FB0 ?GetNewInstance@@YGKXZ = ?GetNewInstance@@YGKXZ (unsigned long
__stdcall GetNewInstance(void))
我尝试使用 __cdecl 代替 __stdcall,结果相同。我已经接近完成这个项目了,我一直在寻找,希望这是我的最后一件事。
谢谢。
【问题讨论】:
-
我看到你提到“CComms.dll”,但 DllImport 属性似乎在寻找“VLTGLSCommsDLL.dll”。这有什么不对吗?
-
"函数都像这样在 C++ 中导出" 您可以尝试在导出声明中添加
extern "C"以获得通常的__stdcall导出名称?如果 .NET 不能同时导入这两种类型,我会感到惊讶。 -
真的吗?我会说这是一个 C++ 修改。我希望 C
__stdcallmangling 是_GetNewInstance@0。 -
...抱歉,我的意思是 C++ __stdcall 重整。 __thiscall 是 C++ 方法调用约定。
-
您的 C++ 被声明为无符号长整数,但您的 C# 代码只是无符号整数。您的调用约定也不匹配....这是一个问题。