一、什么是CLR
.NET 提供了一个称为公共语言运行时 (Common Language Runtime, CLR) 的运行时环境,它运行代码并提供使开发过程更轻松的服务。
公共语言运行时的功能通过编译器和工具公开,你可以编写利用此托管执行环境的代码。 使用面向运行时的语言编译器开发的代码称为托管代码。 托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。
简单来讲,就是将C++基础设施构建在.NET框架之上,使用.NET运行时来托管C++。托管C++指的就是C++/CLR,非托管C++指的就是运行在MSCRT而非CLR的C++。
举个例子,有些Basic语言的编译器直接生成二进制代码,没有运行时。但Microsoft Visual Basic可运行在.NET运行时上,直接与.NET对象交互。
所以C++/CLR就是微软将C++构筑于.NET运行时的实践,它提供了极好的C#与C++交互的方式。
二、思路概论
简单来讲,可以分为两种思路。
让C++项目直接运行在CLR上。
构建C++/CLR Wrapper库来操作.NET对象,从纯非托管C++调用Wrapper库。
第一种思路是最简单的,将C++项目进行必要的改写以符合C++/CLR语言规范,直接用/clr编译选项进行编译生成即可。但是仅适用于C++项目能被改写运行在CLR上的情况。
第二种思路稍复杂,但适用于所有情况。基本思路是用C++/CLR编写库,对.NET的对象和方法进行重新包装,并向外部暴露这些兼容纯非托管C++的类和函数。非托管代码操作这些类和函数间接实现与C# .NET的交互。
三、C++/CLR调用.NET语法与奇技淫巧
在C++/CLR中,有两种使用C#对象的方法:句柄 (^) 和追踪引用 (%)
1. 句柄使用^符号表示,对应C++中的指针。
使用GCnew可以创建.NET对象,这样的对象不用delete,.NET GC会处理内存。
System