C#、托管C++(C++/CLI)相互调用

2015-05-08 (2015-05-05更新)

C++/CLI(Common Language Infrastructure,通用语言框架)可以简单的认为就是.NET运行的托管C++。

C++/CLI(托管C++)与native C++类

C++/CLI声明的类必须是ref类,即声明方式只能是:

ref class classname{};

ref struct name{};

C++中ref类也只能是托管类。这是最明显的托管C++类和非托管C++类的区别。

C#调用C++/CLI类

C#可以调用Native C++类,也可以调用C++/CLI类,但是区别非常大。

C#调用C++/CLI类注意事项

  • C#可以直接调用ref类,和.net类库内其他类一样
    • ref类的变量(字段)不能使Native C++类类型,可以是指向Native C++类类型对象的指针
    • ref类内部可以直接使用Native C++类类型,只需要导入相关头文件即可
  • ref类的函数(方法)参数可以直接使用Native C++类类型,但是C#无法理解这些参数
    • 也就是说,public函数不要用Native C++类类型作为参数类型

C#可以调用Native C++类类型,无论使用Pinvoke还是其他方法,Native类类型作为参数都很难处理。当然也有处理的方法(通常是把native类重新包装)

C++/CLI调用C#

在C++/CLI文件内引用C#类库文件和命名空间即可,例如:

#using "..\..\win32\LMath.dll"
using namespace My::LMath;
Fork me on GitHub