[b]1. 什么是C++/CLI?(又称Managed C++,托管C++)[/b]
托管(Managed) 是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,通用语言运行时是.NET 框架应用程序的执行引挚。它提供了许多服务,其中包括:代码管理(装入和执行)、类型安全性验证、元数据(高级类型信息)访问、为管理对象管理内存、管理代码,COM对象和预生成的DLLs(非管理代码和数据)的交互操作性、对开发人员服务的支持等等。
也就是说,托管C++意味着,我们的代码可以被CLR所管理,并能开发出具有最新特性如垃圾自动收集、程序间相互访问等的.NET框架应用程序。
可见,Managed C++(下称MC++)是有别于原来的C++(下称VC++)的一种新的而且十分特殊的.NET语言。
MC++的特殊之处在于Micorsoft为MC++提供了一种称之为“随心而动-it just works”的Interop机制,后称“Interop技术”。即对程序中的每一个本地方法,MC++编译器同时生成一个托管和非托管进入点,它们中只有一个是真正方法的实现,另一个则是转发器,可进行相应的转换和必要的调度。托管进入点通常是真正方法的实现,除非代码不能解释为MSIL或开发者使用“#pragma unmanaged”强制指定进入点的实现为本地机器码。当一个IJW转发器起作用时——例如转发到本地代码中,编译器提供转换的实现,并且通过偏移或IAT(Import Address Table)调用实际的实现代码;
MC++是随VS 2003问世的,但其前进道路却不顺利,VS2003版的MC++语法十分笨拙不受程序员的欢迎,之后VC++小组又重新编写了较为优雅的新语法,称为"C++/CLI",但前后两种语法的问世,也造成了一定的混乱,这篇文章的主旨之一,就是澄清2003版和C++/CLI之间的语法区别。
MC++提供了托管代码和非托管代码之间的桥梁,如果你的工作不涉及托管环境,则可以直接忽略MC++的语法,只关注VC++。对于工作在托管环境的程序员,MC++提供了一些有趣场景:
1. 提供了原有代码向托管环境的迁移手段,比如我正在做的项目,就是将Webkit迁移到.NET平台上来。而最有名的案例当属DOOM小组,他们在三天内完成了DOOM.NET!
2. 保护商业机密,你可以将核心代码置于VC++之中编译成非托管的二进制代码而不被人反编译。
3. 提供底层硬件访问机制,等等。
4. Windows下各种SDK提供了丰富的类库(lib),足以取代许多多余的框架。
二、MC++的语法演进
我们至今能可以看到2003版的MC++的语法,在其托管扩展中定义垃圾回收类、属性等等常用到的双下划线关键字:
现在这些为更接近C#的语法所取代,因此强烈建议使用MC++的程序员将代码迁移到新的C++/CLI语法上来。上面的例子在C++/CLI的写法为:
在新语法中的类型被声明为“什么的类”,前置的形容词描述了你将创建什么样的类,如下所示:
我们将逐一介绍新的C++/CLI语法,并附带如何将原来的MC++语法迁移到C++/CLI上。
托管(Managed) 是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,通用语言运行时是.NET 框架应用程序的执行引挚。它提供了许多服务,其中包括:代码管理(装入和执行)、类型安全性验证、元数据(高级类型信息)访问、为管理对象管理内存、管理代码,COM对象和预生成的DLLs(非管理代码和数据)的交互操作性、对开发人员服务的支持等等。
也就是说,托管C++意味着,我们的代码可以被CLR所管理,并能开发出具有最新特性如垃圾自动收集、程序间相互访问等的.NET框架应用程序。
可见,Managed C++(下称MC++)是有别于原来的C++(下称VC++)的一种新的而且十分特殊的.NET语言。
MC++的特殊之处在于Micorsoft为MC++提供了一种称之为“随心而动-it just works”的Interop机制,后称“Interop技术”。即对程序中的每一个本地方法,MC++编译器同时生成一个托管和非托管进入点,它们中只有一个是真正方法的实现,另一个则是转发器,可进行相应的转换和必要的调度。托管进入点通常是真正方法的实现,除非代码不能解释为MSIL或开发者使用“#pragma unmanaged”强制指定进入点的实现为本地机器码。当一个IJW转发器起作用时——例如转发到本地代码中,编译器提供转换的实现,并且通过偏移或IAT(Import Address Table)调用实际的实现代码;
MC++是随VS 2003问世的,但其前进道路却不顺利,VS2003版的MC++语法十分笨拙不受程序员的欢迎,之后VC++小组又重新编写了较为优雅的新语法,称为"C++/CLI",但前后两种语法的问世,也造成了一定的混乱,这篇文章的主旨之一,就是澄清2003版和C++/CLI之间的语法区别。
MC++提供了托管代码和非托管代码之间的桥梁,如果你的工作不涉及托管环境,则可以直接忽略MC++的语法,只关注VC++。对于工作在托管环境的程序员,MC++提供了一些有趣场景:
1. 提供了原有代码向托管环境的迁移手段,比如我正在做的项目,就是将Webkit迁移到.NET平台上来。而最有名的案例当属DOOM小组,他们在三天内完成了DOOM.NET!
2. 保护商业机密,你可以将核心代码置于VC++之中编译成非托管的二进制代码而不被人反编译。
3. 提供底层硬件访问机制,等等。
4. Windows下各种SDK提供了丰富的类库(lib),足以取代许多多余的框架。
二、MC++的语法演进
我们至今能可以看到2003版的MC++的语法,在其托管扩展中定义垃圾回收类、属性等等常用到的双下划线关键字:
//老旧的MC++语法
public __gc __sealed class Student
{
private:
double m_grade;
String* m_name;
public:
__property double get_Grade() { return m_grade; }
__property void set_Grade(double newGrade) { m_grade = newGrade; }
__property String* get_Name() { return m_name; }
__property void set_Name(String* newName) { m_name = newName; }
}
现在这些为更接近C#的语法所取代,因此强烈建议使用MC++的程序员将代码迁移到新的C++/CLI语法上来。上面的例子在C++/CLI的写法为:
//新的C++/CLI语法
public ref class Student sealed
{
private:
double m_grade;
public:
// 标准属性语法
property double Grade
{
double get() { return m_grade; }
void set(double newGrade) { m_grade = newGrade; }
}
//其他属性
property String^ Name;
}
在新语法中的类型被声明为“什么的类”,前置的形容词描述了你将创建什么样的类,如下所示:
class N { /*…*/ }; //本地类型
/*-----------CLR的类型------------*/
ref class R { /*…*/ }; // CLR引用类型
value class V { /*…*/ }; // CLR值类型
interface class I { /*…*/ }; // CLR界面接口类型
enum class E { /*…*/ }; // CLR枚举类型
我们将逐一介绍新的C++/CLI语法,并附带如何将原来的MC++语法迁移到C++/CLI上。