【开发日记】C#调用C++图像处理算法(opencv)

我用C++开发算法,同事用C#实现业务逻辑。我是第一次做C#和C++的交互,如今遇到问题。

问题:手头有一个C++算法类,打算通过dll调用函数的方式,在C#中实现该算法。具体就是写个函数,函数内部调用了算法类;C#用DllImport调用该函数。结果,报错找不到入口。

已排除DllImport错误使用的可能,因为把函数内部调用算法类的部分去掉,C#那边是可以正常运行的,说明是算法类的问题。既然DllImport行不通,只能采取托管C++的方式,但是担心影响算法的性能(心里对托管C++的效率没底),毕竟是实时处理算法。

基本思路:把非托管C++封装为托管C++,再做成dll,C#直接调用


参考:

http://wenku.baidu.com/view/6accbfff9b89680203d8256b.html


整理一下步骤:

vs2012

1、建立“win32项目”,选择”windows应用程序“,属性设置"公共语言(/clr)",输出格式改为".dll";

2、生成后的主文件的.cpp和.h不用管,把纯C++的函数和类添加进来;

3、写封装代码,就是一个托管C++形式的类,带关键字public ref class,在该类里面调用纯C++的函数和类;

4、编译生成dll,C#里面用reference的方式调用,很简单


以上方法证明是不可行的!根本没有命名空间,C#不能调用!


最后还是成功了,依旧是粗心所引致的!!!之前C#一直报错,竟然是因为我提供给同事(负责C#)的opencv的dll是debug版本的,而我的C++接口则是用release编译的,怪不得不行!汗~~~~~~~~同时,不得不感叹,C#和C++的混合编程实在不太好调试,C#老报错,但没有说明错误的原因,就是一句找不到dll入口,使得我老是在纠结各种问题:C++里面有类导致C#不能调用?C++里面又调用了第三方库(CV)可能这样C#也不认?没有做好C++和C#的数据类型转换?内存管理机制导致出问题?......总之这些都一一地探究过了,最后也都没有找到解决办法,网上关于这一块的东西又少之又少,可能根本就没有人遇到过我的问题。结果,真的是自己粗心导致的。搞技术啊,有时候还真要有点自信,理论上怎么分析都是对劲的,为什么实际就出错?可能就是一时的粗心大意!但这种错误往往让开发者付出沉重的时间代价。


总结:C#调用C++的API,只需要通过PInvoke的方式,如果API内部需要调用第三方库或者包含一些类,其实是不影响API在C#中的调用的!如果报错,就要认真检查第三方库的dll是否存在问题(版本不对)

你可能感兴趣的:(C++,C#)