我正在尝试在c#应用程序中使用本机c ++ dll。

我按照this文章开始。

当dll仅使用c文件(如本教程中所述)时,它的工作正常,但是当使用cpp文件时,我无法使其工作。

使用dumpbin工具,我可以看到导出的函数名称已更改。
例如,将函数调用“ next”更改为“?next @@ YAHH @ Z”,当我尝试在c#代码中调用它时,找不到它。

我的dll代码是:

__declspec(dllexport)
int next(int n)
{
    return n + 1;
}


C#代码

[DllImport("lib.dll", CallingConvention = CallingConvention.Cdecl)]
    extern static int next(int n);


使用c文件或cpp文件时使用相同的代码

提前致谢
阿米猜

最佳答案

您正在尝试做一个蹦床功能,以外部化C ++对象的使用。

您遇到的情况称为符号错误处理。这是一种c ++特定的方式,可以在动态库和可执行文件中命名符号(如函数),以实现多态。

您必须通过在库代码中使用extern "C"语句来指定要取消破坏效果,如下所示:

extern "C" __declspec(dllexport)
int next(int n)
{
    return n + 1;
}


有关此here: Exporting functions from a DLL with dllexport的更多信息

07-24 09:45
查看更多