摘要:.NET计划是微软继推出DOS、Windows之后的又一个革命性的开发平台。在整个.NET框架中提出了大量的新概念和新技术。本文从软件开发的角度对.NET框架进行阐述,同时对.NET和J2EE进行比较,并对.NET提出了几点疑问。
关键词:.NET、XML(可扩展标记性语言)、SOAP(简单对象访问协议)、WindowsDNA、集合(assembly)、通用语言运行时(CLR)、IL(中间语言)、元数据(metadata)、名空间(namespace)、C#
一、 序言
什么是.Net?不同的人有不同的解释方式。有人认为.NET是一种全新的下一代可视化开发环境;有人认为.NET是一种新的针对Internet时代的开发语言---C#;有人认为它是基于XML(可扩展标记性语言)和SOAP(简单对象访问协议)的新型信息交换平台,是面向未来的企业级的开发平台。也有人认为.NET只不过是WindowsDNA技术的演变。类似这样的定义非常多,这些说法都对,但是都只是涉及到了.NET的一部分。首先应该肯定的是.NET是一场技术上的革命。在当今社会,技术进步是每天都发生的,但革命不是经常有的。在微软的历史上,从DOS到Windows32是一场技术革命,从Windows32到WindowsNT也是一场技术革命。随着Internet的飞速发展,软件开发的难度正逐步加大,现有的开发平台和开发环境与技术不论是从开发技术上还是从开发模式上越来越无法满足Internet时代的需要的基于Web的应用程序和Web服务,就是在这种环境下,微软推出.NET,可以毫不夸张的认为,.NET是一场革命。在后面对.NET的深入讨论中,我们更能体会到这一点。
二、.NET框架的组成
如图1所示,.NET框架由许多方面构成,在整个结构体的最重要的是系统服务(system Service)和通用语言运行时(Common Language Runtime)。其中通用语言运行时提供很多服务来简化代码的开发和应用程序的部署(deployment),同时在可靠性和安全性方面也提供大量的服务。.NET框架也包括一系列的基础类库,这些基础类库可以为任何一种基于.NET的编程语言使用,通过后面的讨论就会发现在此基础上可以实现代码级的重用。在框架的最上层,.NET提供了一系列组件(注意:在.NET中也许用集合(assembly)这个词代替组件更合适),极大地丰富了开发,不论是开发基于Windows的应用程序,还是开发基于Web的应用程序。
首先讨论集合(assembly),从表面上看,似乎在.NET框架中根本未提到集合的概念,但实际上集合是无处不在的,集合可以认为是受管理的组件。在现在的开发模式下,代码经过编译后生成EXE文件或DLL文件,这些DLL或EXE都是针对某一种特定的CPU的,都是直接以机器码的方式存在。这种方式的弊端已经让几乎所有人都尝过苦头了---DLL陷阱。在实际生活中,经常遇到这样的情况,在升级了某一种DLL的版本后,发现一些原来老版本的功能出现了问题,甚至出现内存冲突、死机等问题。而在集合中,由于代码的生成是以中间语言(Intermediate Language)的形式出现,不基于任何一种特殊的CPU平台,同时在生成集合时自动产生元数据(metadata),此元数据在集合中以货单(manifest)的形式存在,元数据可以对组件进行自我描述,通过元数据,可以知道组件有哪些类型、哪些资源。在元数据中也包含集合的版本号等。有了这样的组件-集合,再也不会出现DLL陷阱等类似的问题。所以说集合是.NET的版本控制技术的基础,集合技术的出现使得开发人员和管理人员可以在不同应用程序之间严格地实行版本依赖政策,因为集合可以自我描述和自我解释。也可以实现真正的无副作用安装。由于集合的自我描述,使得注册表等概念将过时。在.NET平台下,所有的程序安装将变为拷贝,严重的注册表垃圾问题将不存在。在另一方面,由于集合成为能否使用的组件的最小单位,所以集合在.NET的安全领域也有非常重要的作用。
下面谈一下系统服务,在.NET内部包含大量的基础类,这些基础类存在于集合体中。每一种基础类都定义了一些.NET平台潜在的某些属性。属性相似的基础类被包含到同一名空间中(namespace)。在名空间中,最底层也是最常用的名空间是系统名空间,在系统名空间中包含的类均为基类,在作用上有点象Cobject类在MFC中的作用。另外,系统名空间还包括了异常情况处理、垃圾回收、控制台输入输出等等一系列重要地特性。总的来说,如果想利用.NET平台的任何特性,你都需要和名字空间及其所拥有的类进行交互。对于开发人员,在这些名字空间的基础上可以派生自己的类和名字空间。利用系统服务提供的大量服务,开发人员可以以更高的效率、更快的速度、以更好的方式开发基于Internet的程序。
在整个.NET框架中,从技术角度上看,最重要的概念莫过于通用语言运行时(Common Language Runtime),以下均以CLR作为其代表。如果把系统服务看成.NET框架的基础的话,那CLR可以看作.NET框架的核心。对于软件开发人员而言,理解.NET的关键之处就在于对CLR地理解。对于Windows开发人员来说,不论是C RUNTIME LIBRARY还是MFC还是Java Virtual Machine都会或多或少的了解一些。实际上,Windows操作系统本身就可以认为是运行时和库的集合体。运行时和库一起为应用程序提供服务,在一定程度上极大地节省了时间,并且有利于代码的重用。比较COM的编程模式可以更好地理解CLR的编程模式,对于COM而言,它的编程思想是基于类型而不是面向文件的。在这一点上,CLR也是采用的这种办法。在最早的windows编程中,当需要调用某DLL的接口时,一般利用LoadLibrary函数,然后再调用GetProcAddress函数,随着COM的出现,CoCreateInstance和QueryInterface函数改变了这一切。CLR也是以类型为中心的。虽然在编程模式上CLR与COM一样,但在实现方式上是不一样的。CLR克服了一些COM本身固有的弊端,例如类型信息格式不统一、私有类型信息不能接触等。第一,在CLR中组件的概念成为头等类公民。在COM中,表示组件的方式有很多,对象、类、动态连接库都可以表示组件;而在CLR之中组件的概念是以集合(assembily)的形式出现的,对于每一种类型,COM采用128比特的UUID进行定义,而在CLR中为了更好地确保唯一性,采用了128字节的公钥和在局部范围内是保持唯一的类型名称来提供全球唯一表示。当一个客户端应用程序调用某集合时,在客户应用程序中存有一64位的公钥Hash值,从而能确保被调用的集合是正确的集合。第二,对于CLR,只有一种元数据交换格式存在。在COM编程中,需要在IDL中定义类型信息,然后再利用一种具体的语言(C++或Java)去实现。在CLR中开发人员可以在任何一种语言中定义并实现该类型。第三,元数据是完全可扩展的。任何语言都可以扩展CLR的类型信息。第四,在COM中存在两种类型系统,Iunkown型和VARIANT型;在CLR中所有的类型都来自System.Object。第五,在CLR中允许出现接口的多继承。总而言之,正如不了解COM技术就无法真正了解Windows一样,理解CLR对于了解.NET是非常重要的。其实,从一定角度上来说,CLR是COM的向前的巨大飞跃。
三、.NET的新特性
.NET是全新的一种技术,因此,.NET中也包括了很多新特性。这里只列出一些比较重要的特性。
(一)、一致的编程模式
在.NET环境中,所有的应用程序都采用通用的面向对象编程模式,不再像windows环境中那样,既有DLL函数也有COM对象。(二)、简化了的编程模式
这也许是最令开发人员欢欣鼓舞的消息了,在.NET环境下,由于CLR的作用,在进行编程时不再需要掌握GUIDs、IUnknown、AddRef等令人头疼的COM知识了。
(三)、运行于多个平台
对于任何操作平台,只要支持.NET运行时均可以运行.NET应用程序。现在所有的windows平台均可以实现这一点。在将来甚至可以运行在非Windows操作系统上。
(四)、支持多语言的综合
按照COM的原理,代码重用是建立在二进制代码的级别上。在.NET环境下,代码重用可以建立在源码的级别上的,也就是说,别人用C#语言写的某个类可以直接在C++这样的语言中使用。之所以.NET有这样的巨大威力在于.NET为所有的支持.NET编程方式的语言提供了一整套通用的类型系统。
(五)、自动资源管理
可以毫不夸张地说,对于所有开发人员而言最头疼的就是内存泄露问题。在.NET环境下,这个问题得到彻底解决,自动资源管理功能已经加入到CLR之中。同时,由于资源回收功能的加入,在一定程度上安全性也得到了保障,诸如内存溢出攻击等将得到有效控制。
(六)、一致的出错处理方式
相信所有的WindowsSDK程序员都对Windows环境下混乱的错误处理方式感到厌烦,Win32错误代码、异常情况处理、Hresult等等。在.NET环境下所有的程序都采用统一的错误处理方式