';System.EntryPointNotFoundException';当尝试从C#调用非托管函数时
本文关键字:函数 调用 EntryPointNotFoundException System | 更新日期: 2023-09-27 18:26:49
我终于有了一个完整的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"时,我会得到一些wierd输出,我不确定函数名是否被破坏,这就是为什么它找不到入口点
7 6 00002FB0 ?GetNewInstance@@YGKXZ = ?GetNewInstance@@YGKXZ (unsigned long
__stdcall GetNewInstance(void))
我尝试使用__cdecl而不是__stdcall,得到了相同的结果。我很快就要完成这个项目了,我一直在努力,希望这是我的最后一件事。
谢谢。
创建DLL有两种方法。
一种是通过获取函数的地址(老式方法),第二种是通过参数和名称(例如.net使用的"新"方法)。
我想你没有正确使用你的C++dll
也许你应该使用GetProcAddress
GetProcAddress Msdn
以下是一些关于Dll出口的文档,这些文档可能在有用的中提供
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"
问题已解决