尝试从C#调用非托管函数时出现'System.EntryPointNotFoundException'

时间:2012-03-06 16:41:51

标签: c# c++ dll dllimport

我终于有一个完整的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,结果相同。我已经接近完成了这个项目,我已经完成了这个项目,希望这是我的最后一件事。

感谢。

2 个答案:

答案 0 :(得分:0)

您有两种创建DLL的方法。

一个是获取函数的地址(oldschool方式),第二个是参数和名称("新的"方式,例如.net使用)。

我想你没有正确使用你的C ++ dll

也许您应该使用GetProcAddress GetProcAddress Msdn

以下是有关Dll exportation的一些文档,可能会有用

答案 1 :(得分:0)

与VB.NE有同样的问题 如果函数声明没有__stdcall但是具有托管调试助手' PInvokeStackImbalance'警告。

在声明的库函数中

extern "C"  _declspec(dllexport)
int __stdcall GetLine(HWND hwnd, int iLine, TCHAR *buff)

将exports.def文件添加到dll项目

EXPORT
  GetLine

和链接器附加选项

/DEF:"exports.def"

问题解决了