在 C# 中调用 C++

在最近要做的一个项目中,其核心算法是用C++写的,而界面部分准备用C#实现是较好的选择,这就需要在C#的框架中调用C++部分。

在C#中调用C++组建大致有两种方法,一种是将它封装成COM,另一种是封装成动态链接库(DLL)。文章《如何在C#中加载自己编写的动态链接库(DLL)》对这两者做了大致比较,详细讲解了后一种方法,在MSDN的中文版中也有对这个问题更专门的讲解:在 C# 中通过 P/Invoke 调用Win32 DLL

C++和C#中所用的数据类型不同,机制也有所区别,在传递参数时需要特别注意。在C#和C++中还可以通过COM组建的方式来共享数据。比如我要做的这个项目中,C#和C++部分都需要访问IE控件中HTML页面的DOM模型,同时 还有一些信息交互,比如在用C#实现的GUI中选择了网页的某个元素,需要告诉用C++实现的核心算法,这时需要在C++做的DLL中导出一个函数 :

  1. extern "C"  __declspec(dllexport) void tell(IUnknown* element){  
  2.     CComQIPtr<IHTMLElement> ptr(element);  
  3. };  


 在C#中声明这个外部函数:

[DllImport("mydll"), Entry("tell")] public static extern void tell(object element);

调用时这样:
tell( Marshal.GetIUnknownForObject( element.DomDocument )

此时传递的是DOM对象,并用C#中的 Marshal 类进行封装。

原文地址:https://www.cnblogs.com/lizi/p/2362634.html