C#的DllImport库写在C ++(C# DllImport library written o

2019-06-25 18:11发布

我在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的不指定入口点的参数。 谁能帮我?

Answer 1:

要定义一个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


Answer 2:

public static __declspec(dllexport) int captureCamera(int& captureId);

是方法? 如果它的功能,它不能是静态的,因为staticdllexport是互斥的。

而名字是错位的。 见http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling 。 如果你能得到的重整名称,然后提供DllImport它( EntryPoint=MANGLED_NAME ),它应该工作。

您可以提供链接器.def文件,它包含的导出函数的定义,他们的名字都没有,那么错位:

Project.def:

EXPORTS
    captureCamera @1


Answer 3:

你声明

extern "C" {
    __declspec(dllexport) int captureCamera(int& captureId);
}

你的C ++代码中 - C#只可以访问C,而不是C ++函数。



文章来源: C# DllImport library written on C++
标签: c# dll dllimport