微软 .NET

类别:.NET开发 点击:0 评论:0 推荐:

作者:阿新

摘要:.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环境下所有的程序都采用统一的错误处理方式---产生异常。
(七)、安全性
正如我们已经知道的一样,.NET的出现是为了迎合下一代的Internet环境下的企业级计算,一般的访问控制已经不能满足它的要求,所以在安全性方面.NET相对于Windows等其他系统而言,有了更深入的改进。从装载一个类开始,就进行确认检查;在访问代码和相应资源时,又实施代码访问安全措施。.NET提供了一整套机制来判断角色和确认身份信息,并且能作到跨进程和机器从而确保所需的代码在远端没有受到破坏。.NET的安全性也深深地嵌入到CLR结构中,以确保应用程序本身的安全。这些安全机制是对现有操作系统安全机制的一种质上的扩展,比较起来,.NET在安全性上得到了进一步的加强。
(八)、XML和SOAP的引入
回忆下过去分布式应用程序的设计,过去我们设计两层的应用程序,在此基础上出现了诸如CORBA、IIOP、RMI和DCOM这样的协议。人们已经熟悉了这样的分布式系统。但是这样的分布式系统的弊端就是灵活性差,因为这种设计方式使得应用程序固定在服务器端。而Internet是个松散连接、非常分布的世界。原有的Client/Server结构已经过时,这样就提出了全新的编程模式,而XML和SOAP能使这种模式很好地工作。在.NET中XML和SOAP已经深深地溶入其中,并成为非常重要的组成部分。
(九)、全新的编程语言c#
随着.NET的推出,微软也强力推出了一种新型的编程语言c#。C#象VB一样简单,又象C++一样强大。在有些人的眼里,C#是JAVA的复制品。这种说法似乎有一些道理,因为C#太像JAVA了。但正确地说,C#绝不是JAVA的克隆,C#的推出是微软在研究了c、c++、JAVA、Modula2、SmallTalk等大量语言的基础上推出的语言,比较起JAVA来,C#的最大不同之处在于它更接近C++,同时C#也吸收了大量新的概念,例如C#是面向组件的语言,C#能作到与XML协议的最大程度的融合。同时,C#在编译方式上与JAVA又很不一样。C#的推出与.NET是密切相关的。

四、.NET与J2EE的比较

在计算机世界里,新技术不断地出现。以下就SUN公司推出的J2EE和微软的.NET在面向下一代企业计算方面比较一番。
J2EE平台提供了一个基于组件的方法,来设计、开发、装配及部署企业应用程序。J2EE平台提供了多层的分布式应用模型、组件重用、一致化的安全模型以及灵活的事务控制。同时保证您的平台独立的、基于组件的J2EE解决方案不会被束缚在任何一个厂商的产品和API上。通过以上的论述我们可以看到在设计新技术的出发点上应该说.NET和J2EE是非常相似的。但是这两种技术在实现方法和具体的实现技术上都有很大甚至对立的区别点。
首先需要指明的是.NET决不是简单的改进型的Windows操作系统。因为按照微软的设计思想,任何一个操作平台只要安装了CLR就能够运行.NET程序。
1, 在开发语言上,.NET的支持面是比较广的,C++、VB、C#、Perl、COBOL等等均得到支持,开发人员可以很容易找到适合自己的语言。而J2EE只支持JAVA语言。这就是说J2EE在语言的选择面上是比较窄的。当然,C#是.NET支持的最重要的一种语言,相对于JAVA而言,C#是支持JIT(just-in-time)编译方式的,而JAVA是基于解释方式的。同时微软为不同的平台环境提供了不同的JIT编译方式。对于类似于Windows CE这样的移动计算环境,微软提供了压缩的.NET框架,相应的也提供了EconoJIT(经济型编译器)。在一般的桌面环境下,微软提供了标准的编译器。另一方面,C#将成为一种工业标准,因为ECMA(欧洲计算机制造商协会)正在接纳C#;而JAVA语言只是SUN公司提出来的。
2, J2EE支持JAVA、EJB,而.NET支持XML/SOAP。从标准的开放性上来说,XML/SOAP要好于前者。XML由W3C组织提出,得到众多厂家的支持,是下一代Internet上内容表示的标准,XML能够有效地表达网络上的各种知识,为信息的交换和计算提供新的载体。XML相对于网络计算的作用,完全可以与计算机起步阶段ASCII码的作用相提并论。XML也可以说是网络信息的标准代码,它表示的不是符号信息,而是知识化的块状内容。这种标准语言虽然不是程序设计语言,但是它代表的却是下一代网络上互操作的光明前景。说到这里,不由得让人想起了人们"当年"对 JAVA 的狂热。确实,JAVA有着非常诱人的初衷,让许多人能够在这样的一种理想的感召下为想象中的各种系统之间的互操作能力而投入积极的开发中。但是实际上,JAVA既没有成为人们想象中的成功的商业计算工具,也并没有实质上的技术进步。JAVA试图从统一计算平台的角度来实现互操作,但是这可能永远都是一个梦想。真正能够互操作的,只能是标准和通用的数据描述语言。而SOAP协议本身也是由微软和IBM这样的商业巨头联合推出开发。这一切都表明.NET技术标准的开放性是不错的。
3, .NET的SOAP协议能够保证一个平台上的组件能够与.NET平台上的组件进行信息的交换。
4, 最重要的一点是,在现有的条件下,各种各样所谓的跨平台、“编译一次,多处运行”等口号只是商业炒做。JAVA的首席设计师James Goslin在谈到这个问题时曾经表达过这样的看法,所谓的“编译一次,多处运行”口号只是一种美好的想法。这就是说,基于某一种开发平台进行开发是不可避免的,假如你基于IBM公司的WebSphere利用JAVA开发商业程序的话,基本上就固定在这个平台上了。JAVA所号称的100%纯的口号其实不是这样;当然,C#也是如此。
5, 在.NET平台上开发程序的一个重要好处在于可以实现真正的“代码重用”。因为在设计.NET平台时,一个重要的思想就是运行时和具体的语言分开。所有的资源管理、内存分配、变量类型等均由运行时处理,这样的话,用C#写的类直接就可以用在C/C++程序中。这样的话,只要基于.NET平台,过去的程序不会因为要采用新型语言而做非常大的修改。而在J2EE平台上,JAVA就是JAVA,它将运行时和具体的语言混在一起。
总而言之,J2EE和.NET各有各的优点和缺点。二者都是非常优秀的开发企业计算软件的优秀平台。但就象不同的人有不同的嗜好一样,在未来的开发中,还是要根据自己的具体需要而确定具体的应用平台。

五、对.NET的几点疑问
通过上述的分析,我们可以感觉到.NET确实是一场技术上的革命。但是经过研究后还是会对.NET产生几点疑问。
1, 是真正的跨平台吗?
按照微软的说法,任何一个操作平台只要装载了通用语言运行时(CLR)就能作到“写一次、编译一次、任何地点均可运行”。也就是说,CLR对于.NET程序是非常重要的。虽然微软的研究开发中心正在开发CLR模板,从而达到这样的要求。但是至少未来出现的第一版.NET不会有这种功能,它只是支持过去的Windows平台。就算将来融合了CLR模板,能否作到跨平台也是个疑问。
2, COM(组件对象模型技术)真消失了吗?
在2000年的PDC(开发者大会)上,微软曾表示令人头疼的COM编程模式将彻底消失,取而带之的将是CLR,Iunknown等接口将不会出现。对此,不能太乐观,要知道COM是Windows的基础,并且在上面也谈了CLR和COM技术的关系。应该说COM没有消失,而是有了非常大的进步(至少在编程方法上)。
3, 代码级的多语言交互能真正做到吗?
对于像Visual Java、Visual Basic、C#这样的开发受管理的代码(managed code)的语言可以实现多语言交互是可以理解的。但问题是如何与C/C++这样的本身功能非常强大,指针的应用非常广的语言真正做到代码重用哪?

六、后序

.NET作为一种全新的革命性的技术的推出是令人兴奋的。可以相信,随着.NET的正式应用的到来,它将极大的改变我们的开发模式。作为软件开发人员来说,.NET的出现将给我们带来更大的机遇与挑战。与其临渊羡鱼不如退而结网。狼终究还是要进来的,我们只有从现在开始就作好一切准备才能找到最适合自己的软件开发之路,才能在技术上不受制于人。

参考资料:
http://www.microsoft.com/net/whitepaper.asp
http://msdn.microsoft.com/msdnmag
http://java.oreilly.com/

本文地址:http://com.8s8s.com/it/it46386.htm