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版本的库文件中有调试信息。

posted @ 2022-09-16 09:26  幻cat  阅读(721)  评论(0编辑  收藏  举报