我试图在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文件时的代码相同
提前致谢 阿米海
答案 0 :(得分:2)
您尝试做的是创建一个trampoline函数,以外部化C ++对象的使用。
您遇到的问题称为符号修改。它是一种c ++特定的方式,用于命名动态库和可执行文件中的符号(如函数),以实现多态性。
您必须在库代码中使用extern "C"
语句指定要取消修改效果,如下所示:
extern "C" __declspec(dllexport)
int next(int n)
{
return n + 1;
}
的更多信息
答案 1 :(得分:0)
请提供入境点
以下示例
[DllImport("lib.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "next", CharSet = CharSet.Ansi)]
static extern int next(int n);
希望它有所帮助。