2012-03-06 247 views
3

我终于有了一个完整的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尝试,并有相同的结果。我非常接近完成这个项目的过程,我一直在这里工作,希望这是我的最后一件事。

谢谢。

+1

我看到你ntion“CComms.dll”,但DllImport属性似乎在寻找“VLTGLSCommsDLL.dll”。那是什么错误? – Ani 2012-03-06 16:44:55

+1

“这些函数都是用C++导出的,就像这样”您可以尝试在出口声明中添加'extern“C”'来获得通常的'__stdcall'导出名称?如果.NET不能导入这两种类型,我会感到惊讶。 – Rup 2012-03-06 16:46:57

+0

对不起,我应该已经解释过,所有导出的函数都封装在一个extern“C”块中,我只是将这里的一个函数作为示例展示出来,至于我最近对这个DLL名称进行了更改在输入这些信息时,新老混淆了,它正在寻找正确的DLL并找到它,否则它会抛出DLLNotFoundException异常。对代码进行了更改,以便它在所有位置都具有正确的DLL名称。 – 2012-03-06 16:48:48

回答

0

你有2种创建DLL的方式。

一个是通过获取函数的地址(oldschool的方式),另一个是通过参数和名称(“new”方式,例如.net使用)。

我想你不使用你的C++ DLL正确

也许你应该使用GetProcAddressGetProcAddress Msdn

下面是关于Dll exportation一些文件可能派上用场

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" 

问题解决

相关问题