C#调用C++类

        C#调用C++类比较麻烦,有两种方法,一种是原生C(Native C),即必须把C++的成员函数封装成C的全局函数(称为C bindings),然后再供C#调用。一种是托管C++(Managed C++)或者叫C++/CLI,可以识别C++的类和指针,语法上又更倾向于C#,能被C#调用。

        原生C的缺点在于,只有类的成员函数能重用,但类的成员数据不能重用。因此必须要在C#中重新定义这个类,类的方法也要定义,但只需调用C的全局函数即可。这样的话要重写C++类就必须要获得这个C++类的源代码,然后这个C++类的成员可能也是自定义的C++类对象,也要重写,因此就从最底层的C++类到最顶层的C++类都要重写,还是很麻烦的,况且C++有时还会调用STL的容器类,这个如何重写呢?难度还是挺大的。

        原生C可参考

http://www.cnblogs.com/yukaizhao/archive/2011/04/27/csharp_call_cpp_class_struct.html

       托管C++的缺点在于,不能传递C++类。这是因为,托管C++类固然可以在其内部调用C++的类,然而如果要在托管C++类的成员函数中把C++类作为参数或返回值的话,那么是不能实现的,因为C#找不到对应的类型。因此只能传递一些基本类型或者是简单的结构体,因此使用托管C++类虽然比较快捷方便,然而只能是权宜之计。

       托管C++可参考

 http://blog.csdn.net/starlee/article/details/2864588

       

        可以通过opencvsharp进行对比学习,https://github.com/shimat/opencvsharp/releases

        里面的源代码不全,貌似要通过nuget进一步下载,我不是很会下,找到一个github可以提供完整源代码https://github.com/MrBadge/opencvsharp

       通过查看opencvsharp的源代码,便可以发现一些端倪,大概可以窥探到如何在C#中使用C++的类,下面我简单讲解一下。

       首先,C#虽然没有指针的概念,然而C#的类对象都是new出来的,和C++对象的其中一种创建类对象的方法很类似(还有另一种方法,就是直接创建类对象,存放在栈中)。所以最好的方法就是把这两种方法对应起来。

       由于OpenCV的函数返回值往往是C++类对象而不是指针,因此opencvsharp就专门创建了一个叫OpenCvSharpExtern的C++工程,把OpenCV的函数重新封装了一下,使得返回值是C++类对象指针。

       然后在C#中,创建这个C++类对应的的C#类,用一个IntPtr类型来对应这个C++类的指针,作为该C#类的成员。然后在C#中,调用某个函数获取这个IntPtr对象的时候,把 它封装成对应的C#类对象,然后当某个函数的参数要用到该IntPtr对象的时候,就从该C#类对象中把IntPtr取出代入参数中。

       用的是原生C,要用到P/Invoke Interop这个非常陌生的东西,可参考

http://www.cnblogs.com/dc10101/archive/2012/07/02/2573209.html

    很久没更新了,突然间查到一本书,叫做《精通.NET互操作》。已经绝版,不过网上还能找到电子书,淘宝也有影印版。

    可查看https://www.cnblogs.com/Aphasia/p/4148630.html

发布了12 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/outtt/article/details/73879438