我终于有了一个完整的C++ DLL,但我无法从C#调用它。它肯定会找到DLL,因为当我将它从文件夹中移除时,我会得到一个不同的异常'DLLNotFoundException'。完整的错误描述是“无法在DLL'CComms.dll'”中找到名为'GetNewInstance'的入口点。该功能在C++全部出口,像这样'System.EntryPointNotFoundException'当试图从C#调用非托管函数时
__declspec(dllexport) DWORD __stdcall GetNewInstance();
,我把它从C#像这样
[DllImport("CComms.dll")]
private static extern uint GetNewInstance();
// ... and in main
uint inst = GetNewInstance();
当我使用“DUMPBIN /出口CComms.dll”我得到一些奇怪的输出,我不知道是否函数名被错位,这就是为什么它不能找到一个切入点
7 6 00002FB0 [email protected]@YGKXZ = [email protected]@YGKXZ (unsigned long
__stdcall GetNewInstance(void))
我用,而不是__stdcall __cdecl尝试,并有相同的结果。我非常接近完成这个项目的过程,我一直在这里工作,希望这是我的最后一件事。
谢谢。
我看到你ntion“CComms.dll”,但DllImport属性似乎在寻找“VLTGLSCommsDLL.dll”。那是什么错误? – Ani 2012-03-06 16:44:55
“这些函数都是用C++导出的,就像这样”您可以尝试在出口声明中添加'extern“C”'来获得通常的'__stdcall'导出名称?如果.NET不能导入这两种类型,我会感到惊讶。 – Rup 2012-03-06 16:46:57
对不起,我应该已经解释过,所有导出的函数都封装在一个extern“C”块中,我只是将这里的一个函数作为示例展示出来,至于我最近对这个DLL名称进行了更改在输入这些信息时,新老混淆了,它正在寻找正确的DLL并找到它,否则它会抛出DLLNotFoundException异常。对代码进行了更改,以便它在所有位置都具有正确的DLL名称。 – 2012-03-06 16:48:48