c#发展

注册

 

发新话题 回复该主题

码上去学海南公司C与OpenCV,C [复制链接]

1#
北京治疗白癜风最好的医院是哪家 http://www.ykhongye.com/m/

最近一直在搞OpenCV实验大师工作流引擎的C#支持,已经完成大部分C++SDK导出支持C#调用。总结记录一下遇到各种问题。

C++DLL

C++中的支持流程很简单:

第一:在VS中建立一个C++DLL空项目第二:构建C++DLL的代码或者类库第三:声明导出函数接口与实现完成这三步就可以了,上述方式默认是非托管的,别问我什么是托管的方式,我觉得非托管的能用就可以了。但是很多博客上面说的让人云山雾绕。一个简单的实现如下:

#pragmaonce#ifdef_DLL_EXPORTS#defineDLL_API_declspec(dllexport)#else#defineDLL_API_declspec(dllimport)#endif#includeopencv2/opencv.hpp//=========导出函数C++调用接口============classDLL_APIMyTestDLL{public:intaddData(inta,intb);~MyTestDLL();};相关类的实现如下:

#define_DLL_EXPORTS#includemytest.hMyTestDLL:MyTestDLL(){std::cout"destoryinstancedone!"std::endl;}intMyTestDLL::addData(inta,intb){intsum=0;sum=a+b;std::cout"sum:"sumstd::endl;returnsum;}导出类支持的DLL接口函数如下:

extern"C"__declspec(dllexport)void*__stdcallcreateInstance();extern"C"__declspec(dllexport)bool__stdcalladdData(void*p,inta,intb);然后完成相关实现C++代码即可。C++与C#数据交换既然让C#调用C++,就必须知道C++中的各个方法参数在C#中是如何表示,如何初始化,如何传给C++,如何返回数据给C#,这块才是C#调用C++最容易出问题的地方。因此本人总结了几种不同的数据传输方法。图像数据传递方式:C++中的接口定义

extern"C"__declspec(dllexport)bool__stdcallmergeImg(uchar*src,intw,inth);C#中的导出接口定义

[DllImport("your_test_name.dll")]staticexternboolmergeImg(IntPtrsrc,intw,inth);就是把图像数据数组在C#转为INTPtr指针,然后再传递给C++,然后基于OpenCVMat函数重新构建一个Mat对象即可,反之亦然。基本数据类型传递针对常见的基础数据类型,C#跟C++中基本是关键字一一对应的关系,直接参数传递即可,举例如下。C++中的接口定义(求两个数之和)

extern"C"__declspec(dllexport)int__stdcalladdData(inta,intb);C#中的导出接口定义

[DllImport("your_test_name.dll")]staticexternintaddData(inta,intb);这样就实现了各种基本数据类型的传递。结构体数据传递C++中的结构体与接口定义如下

structMyStruct{intage=23;boolgender=false;};对应的结构体调用导出接口

extern"C"__declspec(dllexport)void__stdcallgetYourStructInfos(MyStruct*infos);C#定义的结构体与对应的接口声明

structMyStruct{publicintage;publicboolgender;};对应的C#导出接口

[DllImport("your_test_name.dll")]staticexternvoidgetYourStructInfos([In,Out]MyStruct[]infos);传递结构体数据必须在C++跟C#两边同时定义相关的结构体数据,然后在C#中以结构体数组方法传递到C++,C++一侧以结构体指针方式接受,并完成数据回填以后,返回数据给C#的对应方法。此外C#定义结构体数组必须指定数组长度,结构体内的INTPtr指针必须在C#一侧完成初始化之后传递到C++中,否则必然导致程序偶发崩溃与宕机。

以上就是本次分享的全部内容,想学习更多编程技巧,欢迎持续

分享 转发
TOP
发新话题 回复该主题