';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,得到了相同的结果。我很快就要完成这个项目了,我一直在努力,希望这是我的最后一件事。

谢谢。

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

创建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"

问题已解决