0

我是 C# 的新手。我自己用 C++ 编写了 Dll,我将在 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'.

任务是在不指定 EntryPoint 参数的情况下执行 dllimport。有人可以帮我吗?

4

3 回答 3

5

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包含导出函数定义的文件,并且它们的名称不会被破坏:

项目定义:

EXPORTS
    captureCamera @1
于 2012-06-25T11:54:51.873 回答
2

你在声明

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

在您的 c++ 代码中 - C# 只能访问 C,而不是 C++ 函数。

于 2012-06-25T11:54:36.140 回答
2

您正在定义一个没有 extern "C" 块的 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
于 2012-06-25T12:27:57.003 回答