“对于刚开始接触C#的初学者来说,了解一下.NET平台是很有必要的。”这是我在看C#的时候常听到的一句话,所以就总结了一下有关.NET平台的一些基础知识。事先声明:以下所述,错误难免,如有误导之处,请大家给予指正。
.NET平台
.NET平台又称.NET框架(.NET Framework),是.NET的核心组成部分,提供了一个多语言组件开发和执行的环境,一个完全可操控的安全的和特性丰富的应用开发执行环境,这不但使得应用程序的开发和发布更加简单,并且实现了众多语言间的无缝集成。一个.NET应用程序一定是一个运行在.NET Framework上的应用程序,如果一个应用程序跟.NET Framework无关,它就不能叫做.NET程序。
.NET体系结构
首先,给出.NET作为开发平台在计算机中的位置,如图所示:
然后,给出.NET Framework的体系结构,如图:
在图中可见,.NET framework体系结构的最顶层是各种语言,有Visual Basic.net、Visual C++,visual C#.net和visual j#.net等几十种。其中,C#是为了更好的发挥.NET的各种优势,Microsoft公司在几十年开发程序设计语言的基础上,精心设计的全新程序设计语言。
图中可以看出,CLR是.Net Framework的底层,它定义了在不同的编程语言之间通用的数据类型,提供程序运行所需要的内存管理和生命期管理。CLR的意义在于:从运行时的角度看,.NET是基于Windows系列操作系统(包括服务器、工作站、智能手机、PDA)的跨设备的统一运行平台;从开发者的角度看,凡事符合CLS的程序语言所开发的程序都可以在任何有CLR的操作系统上执行和互操作,具有与平台无关的特性,同时可以相互调用。从图中还可以看出,CLR之上的是.NET Framework类库,它提供了一整套从基本输入输出到数据访问以及用于构建Web应用和Windows桌面应用的组件类库。
上面这幅图是程序执行过程,我们可以看到,几乎所有语言在进入.NET的时候必须重新设计编译器,在语言外部特征不变的情况下,语言的内在规则最好尽量符合公共语言规范(common language specification ,CLS ),编译器向公共语言运行库(common language runtime,CLR )提供原始信息。需要注意的是,编译器向CLR提供的编译结果并不是机器代码,而是一种中间语言(Microsoft intermediate language,MSIL).中间语言再由JIT(just in time)编译器编译,JIT将中间语言快速地转换称本地机器指令,在CLR中执行。在图中,CLS外面使用了一个虚线框,目的是说明CLS并不是一个实体,而是编译器遵守的规范。CLS不能支持所有的语言的所有成分,对于不受CLS支持的成分,则需根据不同的情况另行处理。
另外,如果还是不太理解的话,我可以再举一个C#的具体例子,如图所示:
.NET平台的实体
.NET平台有两个重要的实体:公共语言运行库和.NET Framework类库,下面分别加以了解。
公共语言运行库
CLR(Common LanguageRuntime),又称公共语言运行时或公共语言运行环境,是.NET系统架构中核心的部分,CLR和Java虚拟机一样是一个运行时环境。其主要功能包括:执行和管理:完成运行过程中的代码加载/应用程序和托管对象的内存管理/对象自动布局,使用JIT(just in time)编译器将MSIL编译成本地代码并且控制代码执行、处理一场等全部步骤。提供安全保证:类型安全、代码访问安全、控制托管和非托管代码的互操作。对开发者的支持:提供界面信息,帮助调试。
CLR还能够自动地处理对象的存储分配、管理对象的引用,在对象生命期结束时回收资源,以防内存泄漏和一些程序错误,这种技术又称为垃圾收集器(garbage collection,GC)。
.NET的一大特色是支持跨语言集成,又称跨语言编程、混合编程或者跨语言互操作。在.NET上用不同语言生成的对象可以互相通信,它们的行为能够紧密集成。如:用一种语言定义一个类,可以在另一种语言环境中继承这个类;用一种语言写的方法,被调用时,可以用另一种语言编写的对象作为实参。
为了实现这一目标 ,.NET框架中采用了很多新技术,但是这些技术不能涵盖现有语言的所有成分,有的甚至彼此矛盾。因此,在.NET中,将代码分为托管代码和非托管代码两种。下图中显示了CLR、非托管代码和托管代码之间的关系:
.NET Framework类库
FCL(Framework Class Library)和CLR一样,.NET框架类库(.NET Framework class library)是构成.NET框架的另一个实体,它提供数千个类、接口等工具供程序员使用,其主要有如下几个部分:
ASP.NET技术,对应System.web命名空间
ADO.NET技术,对应System.Data命名空间
Windows Forms,对应System.windows.forms命名空间
生成和处理XML文档,对应System.XML命名空间
.NET Framework类库划分为两个部分:基类库(BCL),Framework类库(FCL)。
BCL(Base Class Library)是整个类库的子集,它包含为应用程序提供核心功能的一组类。BCL可用于使用.NET Framework的任何语言,它封装了所有通用的功能,例如文件处理、数据库访问、图形操作和XML文档操作。FCL(Framework Class Library)是整个类库,它提供了用于开发上面列出的所有不同类型应用程序的类。
.NET框架类库使用具有层次结构的命名空间组织该类库中的类,例如,执行i/o操作的所有类位于System.io命名空间中,而操作线程的类则位于System.Threadign命名空间中。.NET支持的所有语言都能使用类库,任何语言使用类库的方式是一样的,任何一种应用程序使用类库的方式也是一样的,学会使用类库是设计基于.NET的各种应用的基本功。这和CLR不太一样,因为通常情况下,CLR对程序员而言是透明的,而类库是程序员必用的工具。
中间语言和程序集
.NET将托管代码编译为微软中间语言MSIL(microsoft intermediate Language),它不受平台(windows)类型的限制,.NET应用程序的代码都要转换成MSIL。它不仅包含用于加载、存储和初始化对象,对对象调用方法的指令,还有用于算术和逻辑运算、控制流、直接内存访问、异常处理和其它操作的指令。MSIL地地位如同汇编语言,但并不是针对某个特定CPU上的指令集,而是与CPU无关的代码。MSIL经过JIT编译器的编译,才能形成可执行的机器代码。CLR中包含多种JIT编译器,因此MSIL可以在不同的计算机结构中运行。
编译为MSIL字节代码的应用程序存储在程序集中。程序集是一种程序单位,每个程序集只有一个入口(Main).程序集包含一个或多个可移植的可执行文件(Portable Executable ,PE)中,并且可以采用EXE或DLL作为扩展名,
程序集包含如下一些信息:
清单:程序集的相关信息,如标识,名称,版本等。
版本化:程序集的版本号。
元数据:描述程序集的类型和方法的信息。
公共语言规范
公共语言规范(Common Language Specification,CLS)是一组规则和约束,保证用不同编程语言编写的类型之间的可交互操作性。大部分类库成员都支持CLS,因此,任何支持CLS的语言都可以使用这些类库,保证了用那些语言开发的程序可以相互集成。公共语言规范是通用类型系统的一个子集,如果开发人员按照CLS规则设计可公开访问的对象,只要其他开发人员使用的是.NET支持的编程语言,那么这些对象很容易被其他开发者共享。
通用类型系统
通用类型系统(Common Type System,CTS)是一个内置在公共语言运行库中的类型系统,它支持大多数编程语言中存在的类型和操作。CTS定义了统一的类型系统,并且定义了类型是怎样在CLR中说明、使用和控制的。CTS定义的类型系统必须是完整的、面向对象的,能够被CLR正确理解和执行。.NET支持的语言都能使用CTS,但是它们出现在程序员面前的时候,不同语言中的类型形式可以各自不同。例如,在CTS中定义单精度整型数的类型是int32,在Visual Basic.Net中单精度整型数类型的关键字是integer,而在C#中是int。尽管不同语言规定可以不一样,但是被编译以后,却是完全一致的。
总结
这里我只是阐述了一下.NET平台的相关知识,如果单单对于.NET这一块儿来说,.NET平台只能算是.NET的一部分。事实上,.NET作为新一代互联软件和服务战略,将使微软现有的软件在网络时代不仅适用于传统的个人计算机,而且能够满足呈现强劲增长的新设备的需要。.NET战略广义上包括:.NET开发平台、.NET服务器、.NET基础服务和.NET用户体验,其中.NET开发平台是.NET战略的核心第一步,也是其他部分的基础和前提。