从.NET CLI(第3版)看.NET Framework 2.0

来源:互联网 发布:渭南市广电网络 编辑:程序博客网 时间:2024/06/05 11:23
.NET CLI(第3版)看.NET Framework 2.0
 
V0.01
 
20056月,.NET CLI(第3版)正式成为ECMA标准ECMA-335(第3版),第3.NET CLI对应.NET Framework 2.0。了解第3.NET CLI对了解.NET Framework 2.0内核有重要意义,本文试通过简要分析.NET CLI(第3版)包含的内容,初步了解一般资料中较少涉及的.NET Framework 2.0内核相关信息。
 
1 什么是.NET CLI
 
.NET CLI.NET公共语言基础结构(.NET Common Language Infrastructure)的缩写,.NET Framework基于.NET CLI.NET CLI文档中对.NET CLI的定义是:.NET CLI定义了一个公共语言基础结构,在公共语言基础结构中,各种不同的高级语言开发的应用程序,无需修改程序以适应不同的系统环境特有的特性,就可以在不同的系统环境下运行。
 
这个定义点明了.NET Framework的基本特性:
 
1.NET FrameworkJava一样,具有跨平台性,“不同的系统环境”实际上就是不同的硬件和软件平台(包括操作系统),理论上说,在任何硬件和软件平台上,只要实现.NET Framework,就可以不加修改地运行任何.NET应用程序,而无需考虑平台自身的特性。
 
2.NET Framework还可以支持多种高级语言(跨语言性),任何.NET编程语言,即.NET平台支持的高级语言,开发的应用程序在.NET Framework上是等价的,都可以在.NET Framework上运行。
 
无论商业的炒作如何进行,系统底层程序员应该保持清醒的头脑,从.NET Framework的基本特性看来,通常被称为.NET CLR.NET公共语言运行时,.NET Common Language Runtime)的.NET Framework底层,本质上一定是类似于Java虚拟机(Java VM)的虚拟机,.NET CLR执行的代码一定也是一种虚拟机代码或者中间代码,否则.NET Framework不可能实现跨平台,特别是适应不同的硬件平台。因为不同的硬件平台,CPU的指令集可能是不同的,只有通过虚拟机将中间代码在运行时动态转换为CPU指令集支持的本机代码,才能实现中间代码在不同硬件平台上的同样执行,进而实现适应不同的硬件平台。
 
.NET Framework可以支持多种.NET编程语言,这意味着:任何.NET编程语言的源程序最终都编译成相同的中间代码,也就是可以在.NET CLR(虚拟机)上运行的虚拟机代码。
 
2 .NET CLI包含的内容
 
.NET CLI(第3版)文档包含下列部分:
 
1、概念和体系结构:描述.NET CLI的全部体系结构,提供公共类型系统(CTSCommon Type System)、虚拟执行系统(VESVirtual Execution System)和公共语言规范(CLSCommon Language Specification)的标准化描述,还提供对元数据(Metadata)的信息性描述。
 
2、元数据的定义和语义:提供元数据的标准化描述,包括元数据在.NET扩展PE文件格式中的位置(以.NET扩展PE文件格式的形式表示),元数据的逻辑内容(以表格及其关联的集合的形式表示,实际上使用了形式化方法表示)和元数据的语义(以汇编成为虚拟机代码的汇编器ilasm理解的形式表示)。
 
3CIL指令集:描述公共中间语言(CILCommon Intermediate Language)指令集。CIL又称MSIL(微软中间语言,Microsoft Intermediate Language),CIL指令就是虚拟机代码或者中间代码的指令。
 
4Profile和库:提供CLI库的简要介绍,以及将其分解为Profile和库的规范。这里有一个配套的文件CLILibraryTypes.xml,考虑过随这一部分一起发布,不过该文件是XML格式的,该文件提供了CLI库中每一个类、值类型和接口的细节说明。“Profile”一词在这里的含义是库的集合,一起组合起来构成提供一定功能级别的一致性整体,换而言之,不同的Profile对应不同的库集合,提供的功能级别也不同,“Profile”一词亦可翻译成“库概要”或者“库配置”,但切勿翻译成“配置文件”。
 
5、调试交换格式:可交换(.NET CLI通用)调试信息的格式。
 
6、附件
 
.NET CLI文档包含的整体内容来看,.NET CLI包含下列内容:
 
1CLS.NET CLS
2CTS.NET CTS
3VES
 
VES是通常所说的.NET CLR的核心,这也是.NET CLR本质上是虚拟机的又一证明。
 
4、元数据
 
包括.NET扩展PE文件格式。
 
5CILMSIL
6、库和Profile
7、调试信息的格式
8、附件
 
实现.NET CLI定义的公共语言基础结构即可实现.NET Framework的子集。了解.NET CLI可以从底层较为详细地了解.NET CLS.NET CTSVESMetadataNET扩展PE文件格式、CIL等,这是系统底层程序员了解.NET Framework内核以及开发相关软件所必需的。推荐任何一位.NET系统底层程序员认真阅读.NET CLI文档,.NET CLI文档可在Microsoft公司网站上下载。
 
3 .NET CLI包含内容意义的分析
 
.NET CLI提供了一个可执行代码(CIL代码)和代码运行的执行环境(VES)的规范,提供给VES可执行代码的是模块(Module),模块是一个文件格式中包含可执行内容的文件。
 
.NET CLI的核心是一个统一的类型系统(CTS),所有的.NET编程语言编译器、工具甚至.NET CLI自身都使用CTSCTS模型定义了一组.NET CLI在定义、使用和管理类型时遵循的规则,CTS确定了实现跨语言集成、类型安全和高性能代码执行的框架,通过描述CTS可以描述.NET CLI的体系结构。
 
元数据用于描述和引用CTS定义的类型。因为元数据包含在.NET编程语言编译生成的最终的可执行文件——.NET扩展PE文件中,所以所有的.NET可执行文件中,仍然包含源程序中的所有类型的定义(描述),通常所说的.NET编程语言中的类(Class),也是CTS中定义的一种类型——引用类型的一种,这意味着所有类型,包括类,可以在.NET可执行文件运行时动态访问,例如在运行时动态确定使用某种类创建对象,而不是在编译时就确定创建对象的类。
 
CLS.NET编程语言设计者和框架(例如类库)设计者之间的协定,CLS指定了CTS的子集和用法约定,编程语言通过实现CLS定义的CTS的最小化部分即可获得最大的访问框架的能力。例如:类库暴露出的接口如果只使用CLS指定的CTS子集中的类型,并遵循CLS协定,那么类库就可以被任何.NET编程语言调用。制定CLS的目的是考虑到跨语言集成,因为各种.NET编程语言虽然有其共性,但也有其特性,例如C#支持运算符重载而VB.NET不支持,同样VB.NET支持后期绑定语法而C#不支持,跨语言调用的类型必须是各种.NET编程语言都能支持的类型,所以要定义各种.NET编程语言都支持的CTS子集和用法约定。任何.NET编程语言都必须遵循.NET CLS,例如VB6对面向对象的支持不完整,但作为.NET编程语言的VB.NET,必需完全支持面向对象,这导致了VB6VB.NET的不兼容。
 
VES实现并强制遵守CTS.NET可执行文件完全由类型(包括类)构成,VES执行.NET可执行文件,实际上是执行类型,本质上是在元数据——类型定义的驱动下执行类型中方法的实现,方法的实现可以是CIL代码,也可以是本机代码,例如Visual C++.NET中的混合程序集同时包含CIL代码和本机代码,这就是托管执行(受控执行,Managed Execution)的本质。VES通过执行类型来实现并强制遵守CTS,因为类型是遵循CTS的,VES只能执行遵循CTS的类型。
 
虚拟机代码——CIL代码的指令集,近似一种虚拟的RISC体系结构CPU的指令集,CIL指令同样可以用一种虚拟的汇编语言表示,称为IL汇编语言。.NET可执行文件中的类型,其方法只要是用CIL代码实现的,可以反汇编成IL汇编语言的形式。因为CIL代码本质上是一种虚拟机代码,要将CIL代码反编译成.NET编程语言的源程序形式也是很简单的,如同Java可执行文件可以反编译成Java源程序一样。
 
4 3.NET CLI中添加的内容
 
2.NET CLI2002年发布,对应.NET Framework 1.0,第3.NET CLI对应.NET Framework 2.0。对比第2.NET CLI和第3.NET CLI,可以发现第3.NET CLI添加的内容,最重要的就是对泛型(参数化的类型,Generics)的支持,这与.NET Framework 2.0的底层——.NET CLR 2.0添加的最重要内容是一致的。
 
5 .NET CLRJava VM的异同
 
.NET CLR的本质和Java VM类似,都是虚拟机,这与Microsoft声称.NET Framework可以跨平台是对应的。
 
但是.NET CLR并不强调100%的平台无关性,托管执行的本质只是元数据驱动执行,尽管类型中方法的实现一般都使用CIL代码,例如C#VB.NET的编译器只生成CIL代码,但不排除使用本机代码,例如Visual C++.NET的编译器可以生成同时包含CIL代码和本机代码的可执行文件,本机代码显然是平台相关的。
 
.NET Framework中,很多.NET框架类库的实现只是一种对Windows平台的包装,最终调用的还是Windows API或者Windows相关服务,例如企业服务(Enterprise Services)最终调用COM+企业组件服务。.NET框架类库是.NET应用程序调用的API,显然,使用了上述.NET框架类库的.NET应用程序是不可能离开Windows平台的。
 
.NET应用程序还可以直接调用Windows API,直接调用Windows API.NET应用程序更不可能离开Windows平台。
 
可见Microsoft并不把跨平台作为.NET Framework追求的首要目标,.NET CLR是和Windows平台甚至硬件平台协同工作的,而Java VM的目标则是实现完全的跨平台,在各种硬件和软件平台上都有Java API的独立实现,可见二者的设计首要目标并不相同。
 
所以.NET CLR称为“Runtime(运行时)”,而Java VM称为“Virtual Machine(虚拟机)”还是很贴切的。
 
Microsoft会让.NET Framework完全跨平台吗?笔者看来现在不会,否则如何保持Windows平台的垄断地位?
 
.NET CLI定义的只是.NET Framework的子集,仅此而已。
 
6 .NET Framework 3.0
 
Windows VistaWindows NT 6.0)将于2006年年底到2007年年初的时间正式发布,Windows Vista中包含了.NET Framework 3.0
 
.NET Framework 3.0WinFX正式发布时的称呼,.NET Framework 3.0提供了4个全新的子系统,对于程序员来说可以认为是4组全新的API,还包括全新的程序设计体系结构,它们分别是:图形用户界面子系统WPFWindows表示层基础,Windows Presentation Foundation)、安全体系CardSpace、网络服务通信子系统WCFWindows通信基础,Windows Communication Foundation)和工作流子系统WFWindows工作流基础,Windows Workflow Foundation)。
 
实际上.NET Framework 3.0的核心仍然是.NET Framework 2.0,其底层仍然是.NET CLR 2.0,因此.NET Framework 3.0的发布对系统底层程序员的冲击相对比较小。从.NET Framework 3.0的核心仍然是.NET Framework 2.0看来,Microsoft无法放弃Windows API时代的大量资源,包括COMCOM+DirectX等,.NET Framework在一段时期内仍然不会完全取代Windows API,系统底层程序员仍然大有可为。
 
引用本文开始处的一句话:无论商业的炒作如何进行,系统底层程序员应该保持清醒的头脑。
 
原创粉丝点击