从.NET CLI(第3版)看.NET Framework 2.0
来源:互联网 发布:渭南市广电网络 编辑:程序博客网 时间:2024/06/05 11:23
从.NET CLI(第3版)看.NET Framework 2.0
(V0.01)
2005年6月,.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 Framework和Java一样,具有跨平台性,“不同的系统环境”实际上就是不同的硬件和软件平台(包括操作系统),理论上说,在任何硬件和软件平台上,只要实现.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的全部体系结构,提供公共类型系统(CTS,Common Type System)、虚拟执行系统(VES,Virtual Execution System)和公共语言规范(CLS,Common Language Specification)的标准化描述,还提供对元数据(Metadata)的信息性描述。
2、元数据的定义和语义:提供元数据的标准化描述,包括元数据在.NET扩展PE文件格式中的位置(以.NET扩展PE文件格式的形式表示),元数据的逻辑内容(以表格及其关联的集合的形式表示,实际上使用了形式化方法表示)和元数据的语义(以汇编成为虚拟机代码的汇编器ilasm理解的形式表示)。
3、CIL指令集:描述公共中间语言(CIL,Common Intermediate Language)指令集。CIL又称MSIL(微软中间语言,Microsoft Intermediate Language),CIL指令就是虚拟机代码或者中间代码的指令。
4、Profile和库:提供CLI库的简要介绍,以及将其分解为Profile和库的规范。这里有一个配套的文件CLILibraryTypes.xml,考虑过随这一部分一起发布,不过该文件是XML格式的,该文件提供了CLI库中每一个类、值类型和接口的细节说明。“Profile”一词在这里的含义是库的集合,一起组合起来构成提供一定功能级别的一致性整体,换而言之,不同的Profile对应不同的库集合,提供的功能级别也不同,“Profile”一词亦可翻译成“库概要”或者“库配置”,但切勿翻译成“配置文件”。
5、调试交换格式:可交换(.NET CLI通用)调试信息的格式。
6、附件
从.NET CLI文档包含的整体内容来看,.NET CLI包含下列内容:
1、CLS(.NET CLS)
2、CTS(.NET CTS)
3、VES
VES是通常所说的.NET CLR的核心,这也是.NET CLR本质上是虚拟机的又一证明。
4、元数据
包括.NET扩展PE文件格式。
5、CIL(MSIL)
6、库和Profile
7、调试信息的格式
8、附件
实现.NET CLI定义的公共语言基础结构即可实现.NET Framework的子集。了解.NET CLI可以从底层较为详细地了解.NET CLS、.NET CTS、VES、Metadata、NET扩展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自身都使用CTS,CTS模型定义了一组.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,必需完全支持面向对象,这导致了VB6和VB.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 CLI于2002年发布,对应.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 CLR与Java 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 Vista(Windows NT 6.0)将于2006年年底到2007年年初的时间正式发布,Windows Vista中包含了.NET Framework 3.0。
.NET Framework 3.0是WinFX正式发布时的称呼,.NET Framework 3.0提供了4个全新的子系统,对于程序员来说可以认为是4组全新的API,还包括全新的程序设计体系结构,它们分别是:图形用户界面子系统WPF(Windows表示层基础,Windows Presentation Foundation)、安全体系CardSpace、网络服务通信子系统WCF(Windows通信基础,Windows Communication Foundation)和工作流子系统WF(Windows工作流基础,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时代的大量资源,包括COM/COM+、DirectX等,.NET Framework在一段时期内仍然不会完全取代Windows API,系统底层程序员仍然大有可为。
引用本文开始处的一句话:无论商业的炒作如何进行,系统底层程序员应该保持清醒的头脑。
- 从.NET CLI(第3版)看.NET Framework 2.0
- 我看C++/CLI和.NET
- .Net Micro Framework导航总贴(新手必看)
- 理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
- 从C#的Singleton设计模式实现看.NET Framework特性对开发者的重要性
- 从C#的Singleton设计模式实现看.NET Framework特性对开发者的重要性
- 从 Microsoft .NET Framework 精简版访问电话 API
- 从 Microsoft .NET Framework 精简版访问电话 API
- 从 Microsoft .NET Framework 精简版访问电话 API
- 从 Microsoft .NET Framework 精简版访问电话 API
- 从 Microsoft .NET Framework 精简版访问电话 API
- .Net framework 2.0
- Net Framework 2.0 事务处理
- .NET Framework 2.0 事务管理
- Net Framework 2.0 事务处理
- .NET Compact Framework 2.0
- Net Framework 2.0 事务处理
- Professional .NET Framework 2.0
- 剖析 .Net 下的数据访问层技术
- PHP - 下载 - AppServ 2.5.9
- asp.net 2.0中的几个小技巧
- 我要学习的书
- 把ACCESS数据库转换SQL数据库
- 从.NET CLI(第3版)看.NET Framework 2.0
- 通过DataSet 对象更新数据库
- Vb.net用Luhn's Algorthim辨别信用卡真假
- OpenLDAP学习笔记
- OpenLDAP快速指南
- OpenLDAP 操作備忘
- jquery 1.2 高级应用--ajax
- 在Ofbiz的base程序库中使用到的一些java开源技术
- samba和openldap结合实战