C#调用C++ DLL
C++使用VS动态链接库生成对应的DLL,将DLL放到C#项目下的bin文件夹对应的目录下。
在DLL过程内,
将C++DLL暴露出来的接口使用 extern "C" __declspec(dllexport) 声明。
extern "C" __declspec(dllexport) int API(int, int);
使用extern "C"的原因是因为C++的接口在编译后会添加额外信息使得函数名发生变化,会导致找不到对应的函数入口。
使用winsiggen工具将C接口转换成C#接口,然后在C#中声明。
然后就可以直接在C#项目中使用了。("<Unknown>"要替换成对应的DLL文件名,如"API.DLL")
C#项目中,在调用C++DLL的地方,在文件开头要添加
using System.Runtime.InteropServices;
当C#警告无法找到对应模块时,一般是对应的DLL缺少,可以看一下C++ DLL是否还引用别的DLL,要将对应的DLL也放到C#文件中。
当C#警告堆栈不对称时,可以在导入接口时增加
CallingConvention = CallingConvention.Cdecl
效果如下:
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="API", CallingConvention = CallingConvention.Cdecl)] public static extern int API(int param0, int param1) ;
C++DLL的release版本的库文件比debug版本的库文件要小很多,这是因为debug版本的库文件中有调试信息。