COM和_NET构件构模件型模
教育软件开发与应用
编辑部:mis@moe.edu.cn《教育信息化》
COM和.NET构件模型COM和.NET构件模型
西南交通大学信息科学与技术学院
张
强
周荣辉
本文首先介绍构件软件和软件构件模型以及构摘要:
件软件的四个基本问题,即:构件互操作性、构件版本问题、语言独立性、跨进程透明性。然后就COM和.NET两种构件模型在四个基本问题上的解决方案进行对比研究,说明.
第一:互操作性
开发者如何创建自己的构件,并确保自己的构件与别的开发者的构件可以相互协作。
第二:版本问题
怎样使一个构件升级的时候系统中别的构件不受影响,即:不同版本的构件和使用这些构件的应用程序间的兼容性问题。
第三:语言独立性
怎样使不同语言开发的构件能相互使用也可以称为语言独立性问题。
第四:跨进程互操作的透明性
怎样使开发进程内交互的、跨进程交互的甚至跨网络交互的构件的编程模型一致。
NET构件模型在简化构件软件的开发和软件构件的部署方
面的优势。
构件模型互操作语言独立性跨进程关键词:
中图分类号:文献标识码:TP311A
文章编号:(2006)1671-720103-0036-03
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
一、构件概述
1.构件在软件开发中的地位
规范的、可重用的软件软件构件(又称组件)是一个封装的、
模块,是组织软件的基本单位。一个基于构件的应用系统是主要
[3]
二、方案对比
下面就对COM和.NET两种构件模型对以上问题的不同解决方案进行讨论。
由构件组成的,这些构件是构件库中已有的,或是通过构件工程自己开发的,只需要少量的代码把这些构件组装起来完成一个应用系统的开发。整个系统的功能由各个构件协调实现,构件之间的相互通信是通过接口来实现的,即基于构件的软件工程是以接口为核心的。
软件构件技术是支持软件复用的核心技术,软件复用被认为是解决软件危机的最有效方法。面向对象的方法也提供了软件复用,而软件构件技术支持的软件复用粒度更大,一个构件可以包括多个类。软件构件技术被认为是超越面向对象的方法。目前,
[2]
1.COM构件对象模型
是一种以构件为发布单元的对象模型,这种模型使各软件构件可以用一种统一的方式进行交互。COM既提供了构件之间进行交互的规范,也提供了实现交互的环境,因为构件对象之间交互的规范不依赖于任何特定的语言,所以COM也可以是不同语言协作开发的一种标准。COM不仅仅提供了构件之间的接在COM规范中,把对象称口标准,它还引入了面向对象的思想。
为COM对象。构件模型为COM对象提供了活动的空间,COM对象以接口的方式提供服务,接口是COM模型定义的最基本的实体。
(1)互操作性的解决方案
客户程序用一个指向接口数据结构的指针来调用接口成员函数。如图1所示:
软件构件技术已经在软件开发界迅速流行,可以预测,构件技术将是软件开发技术的趋势。
2.构件模型需要解决的问题
构件模型的思想是创建可重用的构件并将其组合到容器中,以得到新的应用系统。构件模型定义了构件的基本体系结构、构件接口的结构、与其他构件及容器相互作用的机制等。利用构件模型规范说明,构件开发人员开发那些实现了应用系统逻辑的构件,而应用系统开发人员则把这些预先开发好的构件组合成应用系统,组合过程中也要遵循构件模型的规范。
现有的主要构件模型有:MicroSoft的COM/DCOM/CLR、
CORBA的CCM(CORBAComponentModel)、SUN的EJB(EnterpriseJavaBean)。其中MicroSoft的COM/DCOM/CLR模型
最为流行,CLR是.NET平台的核心部分,所以CLR构件模型也叫.NET构件模型。.NET开发平台是微软为了在COM基础上简化软件构件的开发而推出的新一代平台。所有的构件模型必须解决以下四个问题:
图1
接口指针实际上又指向另一个指针,这第二个指针指向一组函数,称为接口函数表,接口函数表中每一项为函数指针,每个函
教育信息化2006年3月
系列光盘征订《国家教育法规文献库》、《世界教育信息文献库》
咨询电话:010-66097054,66097234
发行部:cyl@moe.edu.cn《教育信息化》
数指针与对象的具体实现连接起来。通过这种方式,客户只要获得了接口指针,就可以调用对象的实际功能。
教育软件开发与应用
的处理,处理后的结果是一个符合COM/DCOM二进制规范的数据包。数据包被代理对象传递到存根代码后,首先由存根代码对其进行散列处理,存根代码根据处理后得到的信息调用构件中对象的相应函数。[2]
COM构件是通过接口向用户公布它的类型信息(功能信
息),每个接口都有一个全球范围的唯一的标识符(GUID),称为IID。每个接口可以由一个或多个类来实现,每个COM构件可以包含一个或多个类,这些类用类标识符(CLSID)来唯一标识,CLSID也是全球唯一的。这些信息包含在接口的IDL文件或类型库文件中。COM规定每个COM对象都必须实现
2..NET构件模型
.NET的基本代码打包单元是程序集(Assembly),程序集就是.
版本NET的构件。程序集构成了基于.NET的应用程序的部署、控制、重用、激活范围和安全权限的基本单元。程序集以可执行文件(.exe)或动态链接库文件(.dll)的形式出现,是.NETFramework的生成块,它们向公共语言运行库(CLR)提供了解类型实现所需要的信息。每个程序集都包含用于描述源代码中定义和引用到的类型和成员的数据,这些数据叫元数据。元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件(PE)或存储在内存中的程序进行描述。在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明。当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。
对于.NET编程模型来说,元数据是关键,该模型不再需要接口定义语言(IDL)文件和头文件。元数据允许.NET语言自动以非特定语言的方式对其自身进行描述,而这是开发人员和用户都无法看见的。[5]
(1).NET构件交互性解决方案
程序集或模块的元数据包含与另一个程序集或模块进行交互所需的全部信息。元数据自动提供COM中IDL的功能,允许将一个文件同时用于定义和实现。公共语言运行库模块和程序集甚至不需要向操作系统注册,(而COM则必须要在系统的注册表的表项中注册很多信息)。运行库使用的说明始终反映编译文件中的实际代码,
从而提高应用程序的可靠性。面向.NET
IUnKnown接口,任何接口都必须直接或间接派生自这个接
口。这个接口包含三个方法:QueryInterface、AddRef、Release。
QueryInterface用于查找特定接口,其余两个用于对象生命期的管
理。客户程序要使用构件的服务,必须在程序运行时用CLSID和
IID作为参数请求COM基础机制(COM库)创建构件的对象实
例,所有的基于COM的类都在系统注册表内有注册条目,这些注册条目表示了实现这个类的物理构件(.DLL文件)的位置,以及构件的类型等信息。COM库查找系统注册表,找到类的实现构件并把它调入内存,客户程序就可以使用构件的功能了。COM的交互性解决方案依赖于COM的基础机制、操作系统的注册表和接口的IDL文件或类型库。
在COM中没有私有构件的概念,因为任何程序都可以从系统注册表中找到系统中的所有构件并使用它。
(2)版本问题的解决方案
COM的解决方案:通过向构件添加接口,同时保留以前的接
口以向后兼容。COM对象支持多接口的能力是COM解决版本问题的关键。因为在COM中,接口一经发布就不能被更改,如果要增加构件的功能,就必须把要增加的功能定义为新接口,并在构件中实现新接口,还必须保留对老接口的实现以支持老的客户程序。那些知道新版本构件的客户程序就可以通过新接口来使用构件的新功能,而老的客户程序因为可以使用老接口也不会有任何影响。
(3)语言独立性的解决方案
任何能创建指针结构和通过指针调用函数的编程语言都可以创建和使用COM构件。这也是因为COM规范是一个二进制标准,COM构件被实现为二进制的代码段,并遵循COM规定的内存布局,客户程序可以使用指针来调用构件的功能,这就使支持COM规范变得容易。而事实上也有很多语言支持
Framework的编译器向所有的模块和程序集嵌入元数据,使.NET
构件成为自描述构件,从而使构件互用更加简单。这种方式有助于构件的无缝集成。.NET还支持私有构件的概念,以保证某些程序的私有构件不被其他程序使用。
在编制客户程序时,必须在客户程序的工程中添加对服务器程序集的引用,.NET的开发环境可以根据服务器构件程序集中的元数据了解服务器构件里的类及其方法、属性、接口及事件等信息,从而在客户程序代码创建服务器对象时根据这些信息构造服务对象,使客户可以使用服务器构件,实现与服务构件的交互。也就是说.NET构件的交互只依赖于.NET的基础机制,即.NET运行时(CLR)。而且,客户程序与服务器构件的交互在客户程序设计阶段就开始了。
(2).NET的版本问题的解决方案
基于COM的程序在安装时会覆盖同名的现有应用程序的构件,这就导致现有应用程序不能正常运行“问题)。(DLLhell”虽然COM规定在版本更新时必须保持向后兼容,但这是很难保证的。.NET框架采用了一种新型的版本机制来隔离应用程序的构件。对于不需要和其他应用程序共享的构件,就把构件放在和应用程序相同的目录下,一个构件的不同版本可以共存于全局程序集缓存(GAC)中。GAC是在Windows系统目录中的一个子目录,GAC本身是一个结构化的目录,它的内部结构
COM规范。这就实现了由这些语言编写的构件在运行时的语
言透明性。
(4)跨进程交互的透明性的解决方案
客户端总是调用进程内代码,构件对象也总是被进程内代码调用,COM提供了底层的远程过程调用(RPC)支持。使在客户端对进程内、跨进程和跨计算机的构件对象的使用方式一致,构件的实际位置信息是在注册表内,是在构件安装时写入注册表的。客户程序创建了构件对象之后,它通过接口指针调用构件对象的成员函数。但实际上,接口指针所指的是本进程中的代理对象(Proxy),客户调用的是代理对象的成员函数,由代理对象通过跨进程的调用方法(LPC/RPC)与构件进程中的存根代码(Stub)通讯,存根代码再调用构件中对象的成员函数,函数返回的顺序刚好相反。代理对象负责对调用的方法、调用的参数进行称为列集
《教育管理信息化标准》
〔第一部分:学校管理信息标准〕
大16开,1000页,498元/套
咨询电话:010-66097234,66097054
教育信息化2006年3月
37
教育软件开发与应用
使用一些.NET提供的工具来操作的。构件当初生成和测试时所使用的构件的版本号被嵌入在程序集的清单中,当CLR在加载一个程序时,就用清单中的版本号加载对应版本的构件,这种机制可以保证基于.NET的程序使用的是生成和测试时使用的构件。程序集的主要目的之一是版本控制。具体说来,程序集为开发人员提供了在不同软件组件之间指定版本规则以及在运行时强制这些规则的手段,一个程序集的特定版本和依赖程序集的版本在该程序集的清单中记录下来,除非被配置文件(应用程序配置文件、发行者策略文件和计算机的管理员配置文件)中的显式版本策略重写,否则运行库的默认版本策略是:应用程序只与它们生成和测试时所用的程序集版本一起运行。配置文件中的版本策略可以被修改,这就提供了灵活的版本控制机制。
(3).NET的语言透明性方案
公共语言运行库通过指定和强制公共类型系统以及提供元数据为语言互用性提供了必要的基础。因为所有面向运行库(CLR)的语言都遵循通用语言规范(CLS)规则来定义和使用类型,类型的用法在各种语言之间是一致的,元数据通过定义统一的存储和检索类型信息的机制使语言互用性成为可能。编译器将类型信息存储为元数据,公共语言运行库使用该信息在执行过程中提供服务;因为所有类型信息都以相同的方式存储和检索,而与编写该代码的语言无关,所以运行库可以管理多语言应用程序的执行,从而提供面向公共语言运行库的语言间的透明性支持。
公共语言规范(CLS),它是许多应用程序所需的一套基本语言功能。CLS通过定义一组开发人员可以确信在多种语言中都可用的功能来增强和确保语言互用性。如果您的构件在对其他代码(包括派生类)公开的API中只使用了CLS功能,那么可以保证在任何支持CLS的编程语言中都可以访问该构件。遵守CLS规则,仅使用CLS中所包含功能的构件叫做符合CLS的构件。微软自己已经提供了几个面向CLR的语言编译器:C#、托管C++、
所示:
编辑部:mis@moe.edu.cn《教育信息化》
传回给代理对象,代理对象再把结果传给客户端对象。如图2
图2
.NET模型还支持Web服务,Web服务是在Internet上进行
分布式计算的基本构造块,它是通过HTTP执行远程方法调用的一种新方法,其中的HTTP可以利用SOAP(简单对象访问协议)。使用Web服务应用程序可以通过使用多个不同来源的Web服务构造而成的,这些服务相互协同工作,而不管它们位于何处或者如何实现。客户程序只需添加对Web服务的引用,就可以像使用本地构件一样使用Web服务,其它的底层细节都由.NET框架来完成。
与COM一样,.NET也用代理对象来实现跨进程交互的透明性,但.NET是用应用程序的配置文件来登记远程对象的信息(COM使用系统注册表),从而减少了对操作系统的依赖性。以编程方式或通过在配置文件中指定远程对象可以注册远程对象。通过在配置文件中注册远程对象,应用程序的管理员能够无需更改应用程序即可适应远程对象位置的更改。
三、结束语
从以上对COM和.NET两种构件模型的对比可以看出,客户与.NET构件的交互被提前到程序编码时,而且.NET构件之间的交互方式更简单,这给程序开发带来了便利。.NET更加灵活而且安全的版本控制机制彻底摆脱了被称为DLL混乱(DLL
Hell)的困境。对基于.NET的语言强制性地实施公共语言规范
(CLS),使.NET构件在语言透明性方面有了底层的支持,即运行时支持。而.NET在配置文件里注册远程对象和使用.NET远程处理来解决跨进程交互问题,使远程对象的配置简单化了。总而言之,作为构件技术的.NET简化了构件软件的开发和软件构件的部署,.NET构件模型是一种更理想的软件构件模型。这些也就是在开发大型而复杂的应用程序时建议使用.NET平台的理由。!
参考文献:
[1][美]MicrosoftCorporation.VisualStudio.NETMSDN2002[2][美]ClemensSzyperski等.构件化软件:超越面向对象编程(第二版)[M].王千祥等译.电子工业出版社.2004
[3]申利民.柔性软件开发技术[M].国防工业出版社.2003
[4][美]JeffreyRichter..NET框架程序设计(修订版)[M].李建忠译.清华大学出版社.2003
VisualBasic.NET(包括VBScript和VBA)和Jscript,即用这几种语
言编写的程序在运行时都使用CLR。[4]
COM的语言互用性是在程序运行时有效,而.NET构件的语
言互用性是在程序编码时允许使用另一种语言所开发的构件。
(4).NET跨进程交互的透明性的解决方案
运行在不同进程或不同计算机中的.NET构件之间的交互可以通过.NET远程处理机制来实现。通常,.NET应用程序和应用程序域(.NET中的逻辑进程)通过消息进行彼此的通信,
.NET信道服务为此通信提供了基础传输机制。而用应用程序
配置文件来登记远程类型的信息,包括服务器构件的位置、构件对象的激活类型和通信的信道的配置等。此时,.NET的配置文件相当于COM里的系统注册表的作用。.NET应用程序在启动前,公共语言运行时会加载应用程序配置文件,读取有关远程对象的信息。.NET远程处理技术用远程对象的元数据动态创建代理对象。客户端创建的代理对象与原始类具有相同的成员。代理对象的实现只是通过.NET远程处理运行库将所有请求转发给远程对象。远程处理系统会将远程对象的响应结果
[5][美]MatthewMacDonald..NET分布式应用程序[M].戢中东等译.清华大学出版社.2003
教育信息化
2006年3月
系列光盘征订《国家教育法规文献库》、《世界教育信息文献库》
咨询电话:010-66097054,66097234