在c#代码中使用cpp dll

时间:2016-11-03 06:28:06

标签: c# c++ dll

我试图在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文件时的代码相同

提前致谢 阿米海

2 个答案:

答案 0 :(得分:2)

您尝试做的是创建一个trampoline函数,以外部化C ++对象的使用。

您遇到的问题称为符号修改。它是一种c ++特定的方式,用于命名动态库和可执行文件中的符号(如函数),以实现多态性。

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

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

有关此here: Exporting functions from a DLL with dllexport

的更多信息

答案 1 :(得分:0)

请提供入境点

以下示例

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

希望它有所帮助。