Visual C++.NET 2010开发实践:基于C++/CLI
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 .NET与C++/CLI

.NET Framework在Visual Studio 2010开发平台及微软其他.NET开发产品中都是核心组件,主要由CLR(Common Language Runtime,公共语言运行时)和.NET Framework类库两个核心部分组成。CLR提供了用户程序执行的环境,而.NET Framework类库提供了在CLR中执行程序代码时所需的支持。在编写.NET程序时可以用C++、C#或者任何其他支持.NET Framework的语言编写,而这些语言都使用相同的.NET程序库。

1.1.1 .NET框架概述

.NET是Microsoft面向XML Web服务的平台。XML Web服务允许应用程序,不管所采用的是哪种操作系统、设备或编程语言,均可以通过Internet进行通信和共享数据。

其中,.NET框架(.NET Framework)是.NET的核心。.NET框架是由多个组件组成的庞大的框架,它执行应用程序和Web服务(包括类库,称为.NET框架类库或FCL),并提供安全性及许多其他的编程功能。使用.NET开发的应用程序都需要在.NET框架下运行。

.NET框架的体系结构包括五大部分:程序设计语言及公共语言规范(CLS)、应用程序平台(ASP.NET及Windows窗体等)、ADO.NET及基础类库、公共语言运行时(CLR)和程序开发环境(Visual Studio.NET)。.NET框架的体系结构如图1.1所示。

● 公共语言规范(Common Language Specification,CLS):CLS定义了各种语言间的互操作性规则,是许多应用程序所有互用语言的通用功能,如图1.2所示。

● 应用程序平台:该部分主要包括ASP.NET应用程序和Windows Forms应用程序,其中ASP.NET应用程序主要用于构建基于Internet的应用程序,而Windows窗体用于创建基于CLR的Windows图形用户界面的窗口应用程序。

● ADO.NET:ADO.NET主要用于操作存储在关系型数据库管理系统(DBMS)中的数据,它提供了对关系数据、XML和应用程序数据的访问,是.NET框架中重要的组成部分。

● 基类库(Basice Class Library):.NET框架的基类库提供许多类与接口,包括ADO.NET、XML、IO、网络、调试、安全和多线程等,这些类库都是以命名空间的方式来组织的。

● 公共语言运行时(Common Language Runtime,CLR):CLR的作用是负责执行程序,并提供内存管理、线程管理、安全管理、异常处理、通用类型系统及生命周期监控等核心服务。

● 编程工具开发环境:Visual Studio.NET是一套多语言系列的开发工具,使用Visual Studio.NET不仅可以创建Windows平台下的Windows应用程序和网络应用程序,还可以创建网络服务、智能设备应用程序和Office插件等。

图1.1 .NET框架的体系结构

图1.2 公共语言规范CLS

随着.NET技术的不断发展,.NET Framework的发展也经历了几个阶段,从早期的.NET Framework 1.0、1.1发展到.NET Framework 2.0,标示着.NET技术走向成熟,功能也更加强大。在2008年,随着Microsoft推出Visual Studio 2008开发平台,.NET Framework又由2.0更新为3.0和3.5。.NET Framework 3.0、3.5分别在.NET Framework 2.0的基础上进行扩展,增加了很多新特性,如WCF、WPF、WF、LINQ和AJAX等。而目前.NET Framework最新版本为4.0,并被集成在Visual Studio 2010开发平台中。

1.1.2 公共语言运行时

公共语言运行时(Common Language Runtime,CLR)是为执行给定编译代码所需外部服务的集合。例如,若使用MFC建立一个应用程序时,那么该程序就需要MFC运行库;而对于Java应用程序,则需要依靠Java虚拟机等。

CLR是所有.NET应用程序运行时的环境,是所有.NET应用程序都使用的编程基础。CLR也可以看做是一个在执行时管理代码的代理,管理代码是CLR的基本原则,能够被管理的代码成为托管代码,反之称为非托管代码。

CLR中最重要的部分是由mscoree.dll库(又称为公共对象运行库执行引擎)表示的。当应用程序引用一个程序集时,首先自动加载mscoree.dll库,然后由它负责将需要的程序集导入内存。

在.NET框架之上,无论采用哪种编程语言编写的应用程序,都首先被编译成中间语言IL(Microsoft Intermediate Language,微软中间语言,简称IL),然后IL再次经过一个JIT(Just In Time,即时编译)编译器编译成为本地CPU可执行的机器码。.NET编译器和.NET执行引擎的工作流程图如图1.3所示。

图1.3 .NET编译器和.NET执行引擎的工作流程图

在Windows平台中,CLR带有三个不同的JIT编译器:主编译器、PREJIT和ECONOJIT。其中,主编译器是默认的编译器,它主要进行数据流分析并输出经过优化的本地代码,所有的中间代码指令均可被它处理;PREJIT编译器是建立在主JIT编译器之上,并且每当一个.NET组件被安装时它就运行;ECONOJIT编译器能够在并不充分优化的前提下,快速完成IL代码到本地码的转换,编译速度与运行速度都非常快。

1.1.3 C++/CLI概述

Visual C++开发小组在对.NET和C++经过仔细考量之后,决定在Visual C++ 2005中重新设计对通用语言运行时库(CLR)的支持。此项重新设计被称为“C++/CLI”,它为使用及编写CLR类型提供更自然的语法。

公共语言运行时库(CLR)包括了一组规范,CLR是Microsoft .NET的基础,也是CLI的Microsoft版本。C++/CLI语言设计的目标是为了对CLI提供更自然的C++支持,而Visual C++ 2005以及后续版本的编译器则在CLR上都实现了C++/CLI。

C++/CLI是一种用来代替C++托管扩展的新的语言规范,它重新简化了C++托管扩展的语法,并提供了更好的代码可读性。和微软.NET的其他语言一样,微软向ECMA提交了C++/CLI的标准。在2005年11月,ECMA正式推出了C++/CLI的标准ECMA-372。现在可以在Visual C++ 2005、Visual C++ 2008及Visual C++ 2010集成开发环境上使用C++/CLI进行开发。

C++/CLI代表托管和本地编程的结合。在反复过程中,这种结合已经通过源代码级相对独立但又相互平等的组件和二进制元素得到了完成,包括混合模式(本地和CTS类型的源代码级混合,还有一个本地及CLI对象文件的二进制混合),纯模式(本地和CTS类型的源代码级混合,所有的代码都被编译为CLI对象文件),本地分类(可以通过一个特定的打包类来保持CTS类型),以及CTS分类(可以保持本地类型为指针)。

C++/CLI是进行.NET编程模式的最佳切入点。对于C++/CLI而言,需要有一个来自C++的迁移路径,这不仅需要了解C++的底层基础知识,而且也需要一定的C++编程经验。