对于什么是C++/CLI,我们首先可以简单的将其名字划分为两部分来理解,第一,C++,我们熟悉的目前被广泛使用的面向对象的ISO国际标准的高级语言,也称为ISOC++,我们这里以后均称其为ISOC++;第二,CLI,我们可以认为是对ISOC++在CLI上扩展。CLI是通用语言框架的缩写,微软的.NET就是架构在CLI其上,虽然CLI现在也是ISO标准,但是C++/CLI并不是ISOC++委员会对其进行的扩展,所以C++/CLI并不是新版的ISOC++标准,它只是微软针他的CLI实现.NET的扩展。虽然C++/CLI目前并不是ISO标准,但是C++/CLI结合了ISOC++和.NET具有超强的能力,这也就注定了它不可能被我们忽视。
其实C++/CLI除了包含ISOC++和CLI扩展,还有它之所以强大的更重要的原因就是它实现了ISOC++和.NET的无缝连接。下面就详细看这三方面:
1)ISOC++语言
我们知道C++是一门ISO的面向对象的语言,对于这门语言我们也从以下三个方面来看,也正是这三个主要方面决定了他被广泛的使用。第一,C++是一个功能强大的语言。比如C++语言本身提供的基于C语言的内嵌类型,数组,结构体和指针等,C++比C新加入的面向对象的Class,继承,多态和模板等,还有C++标准模板库(STL)提供的实际开发当中常用的数据结构和算法的实现;第二,大量的开源和第三方库,如果在windows上使用C++开发,首先我们可以借助microsoft对C++提供的强有力的支持,比如说VS编译器,还有UI库MFC,还有ATL等;除此之外我们还可以看到其他的许多非microsoft的开源的和第三方的支持,比如说Boost很大程度的扩充了STL,提供了更多更高级的功能,还有Loki把C++与设计模式结合起来,还有很多的第三方的UI库,比如QT,WxWindows,WTL,GTK等,第三方的网络通信库,比如ACE,StreamModule等,第三方的XML库,比如Xerces,CMarkup,tinyxml等,第三方的科学计算库,比如Blitz++,MTL等,第三方的游戏开发库,比如OGRE,KlayGE等,第三方的线程库,比如C++ Threads,ZThreads等,还有其他的很多;第三,C++的高性能。C++的这一特性也是毋庸质疑的,我们知道的大部分的操作系统,嵌入式开发,游戏,图像软件离不开C++,这都是跟C++的高性能有很大的关系,单从这一点来看,这就是很多现代的其他的高级语言所欠缺的,也正是这点注定了C++以后仍然有很长的路要走。
2)CLI
CLI(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所运行需要的虚拟执行环境的规范。更通俗的我们可以说它是一个虚拟平台,是操作系统和应用程序间的一层抽象。微软的.NET的基础CLR(Common Language Runtime,通用语言运行时)就是CLI的一个实例。CLI主要的组成部分有:CTS,Metadata,CLS和VES。
CTS(Common Type System,通用类型系统)是CLI的基础,它是一个类型规范,定义了所有CLI平台上可以定义的类型的集合,所有基于CLI的语言类型都是CTS的一个子集,目前C++/CLI是对CTS描述支持最好的高级语言。
Metadata(元数据):用来描述和引用CTS定义的类型,元数据以一种独立于任何语言的形式存储,正是元数据赋予了组建自描述的能力。
CLS(Common Language Specification,通用语言规范),是用以确保所有CLI语言能够互操作的一组规则,它定义了所有CLI语言都必须支持的一个最小功能集(一个CTS的子集)。各CLI语言可以选择自己对CTS的一部分的映射,但是为了确保不同语言的交互,至少应该支持CLS所定义的最小功能集。
VES(Virtual Execution System,虚拟执行系统),为CLI程序提供了一个在各种可能的平台上加载和执行托管代码的虚拟机环境,只是一个规范,比如微软和momo就各有自己的实现。.NET的CLR的JIT和GC应该属于此范围。
.NET Framework是微软对CLI的一个实现,当然也是目前最好的实现,.NET Framework主要包含CLR和BCL,CLR是核心也即CLI的实现,BCL是一套通用的代码库,可以被所有的.NET语言(C#, VB.NET, C++/CLI)程序所使用。
3)ISOC++和CLI的无缝连接
C++/CLI支持对本地ISOC++编程和.NET托管编程的无缝集成,不是简单的混合,不仅能够像.NET调用windows APIs一样通过P/Invoke来实现函数互调,而且可以实现类型class级和ISOC++和.NET类库的相互使用,更强的是能够实现类型的混合。为了实现无缝连接,绝大多数的以前的ISO C++代码编译后将得到托管代码,部分不能编译为托管IL的采用P/Invoke调用实现。代码托管,但是数据并不托管,原来ISOC++中本地堆内的数据仍位于本地堆中。
综上,我们可以总结C++/CLI是ISOC++在.NET的扩展,是ISOC++和.NET的无缝结合。