我在C#相当新。 我所写的DLL在C ++由我自己,我要使用的功能在C#应用程序,DLL。
所以,我做了以下声明时,在函数C ++项目:
public static __declspec(dllexport) int captureCamera(int& captureId);
然后我试图导入C#应用此方法:
[DllImport("MyLib.dll")]
public static extern int captureCamera(ref int captureId);
但我有例外:
Unable to find an entry point named 'captureCamera' in DLL 'MyLib.dll'.
任务是做dllimport的不指定入口点的参数。 谁能帮我?
要定义一个C ++函数,而不一个extern“C”块。 由于C ++允许你重载函数(即创造出许多captureCamera()的不同组参数的函数),该DLL内部的实际功能名称将是不同的。 您可以通过打开Visual Studio命令提示符,将您的二进制文件目录,并运行此检查:
dumpbin /exports YourDll.dll
你会得到这样的事情:
Dump of file debug\dll1.dll
File Type: DLL
Section contains the following exports for dll1.dll
00000000 characteristics
4FE8581B time date stamp Mon Jun 25 14:22:51 2012
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00011087 ?captureCamera@@YAHAAH@Z = @ILT+130(?captureCamera@@YAHAAH@Z)
Summary
1000 .data
1000 .idata
2000 .rdata
1000 .reloc
1000 .rsrc
4000 .text
10000 .textbss
本?captureCamera @@ YAHAAH @ Z是实际编码您指定的参数的重整名称。
正如在其他的答案中提到,简单的extern“C”添加到您的声明:
extern "C" __declspec(dllexport) int captureCamera(int& captureId)
{
...
}
您可以重新检查该名称是通过重新运行DUMPBIN正确的:
Dump of file debug\dll1.dll
File Type: DLL
Section contains the following exports for dll1.dll
00000000 characteristics
4FE858FC time date stamp Mon Jun 25 14:26:36 2012
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 000110B4 captureCamera = @ILT+175(_captureCamera)
Summary
1000 .data
1000 .idata
2000 .rdata
1000 .reloc
1000 .rsrc
4000 .text
10000 .textbss
public static __declspec(dllexport) int captureCamera(int& captureId);
是方法? 如果它的功能,它不能是静态的,因为static
和dllexport
是互斥的。
而名字是错位的。 见http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling 。 如果你能得到的重整名称,然后提供DllImport
它( EntryPoint=MANGLED_NAME
),它应该工作。
您可以提供链接器.def
文件,它包含的导出函数的定义,他们的名字都没有,那么错位:
Project.def:
EXPORTS
captureCamera @1
你声明
extern "C" {
__declspec(dllexport) int captureCamera(int& captureId);
}
你的C ++代码中 - C#只可以访问C,而不是C ++函数。