c++导出dll给c#调用
在C++端包括创建dll项目、源文件下添加类、头文件对方法添加修饰符及在源文件实现头文件方法;在C#端(非CLR)包括将dll拷贝到运行目录及DllImport定义调用的方法。
1、 创建dll项目
2、 源文件下添加类
3、 头文件对方法添加修饰符
extern "C" _declspec(dllexport) double __stdcall TestFuzzy(char * localPath,int cols,int lowThreshold,int heightThreshold);
“extern "C" _declspec(dllexport)”是必备的不然无法导出此方法,“__stdcall”代表参数的顺序
4、 在源文件实现头文件方法
double _stdcall TestFuzzy(char * localPath,int cols,int lowThreshold,int heightThreshold)
{
}
5、 将dll拷贝到运行目录
对C++项目中引用的第三方的库需要一起拷贝过来,如下图引用了OpenCV的库。
6、 DllImport定义调用的方法
[DllImport("ThirdDll.dll", EntryPoint = "TestFuzzy")]
public static extern double TestFuzzy(string localPath, int cols, int lowThreshold, int heightThreshold);
7、 对于第三方库的添加
通过NuGet添加或按照手工步骤添加(包括:“工程---属性---配置属性---c/c++---常规---附加包含目录”、“工程---属性---配置属性---链接器---常规---附加库目录”及“工程---属性---配置属性---链接器---输入---附加依赖项”)
8、 注意事项
不能跨DLL传递std::string用char *替代。c#调用c++的类型对照参考
“https://www.cnblogs.com/profession/p/4935100.html”
参考:
https://www.cnblogs.com/lgyup/p/7116162.html
https://blog.csdn.net/fuck487/article/details/53036086
https://blog.csdn.net/big_bit/article/details/51595714
https://blog.csdn.net/ooyyee11/article/details/6894436