COM, COM+ and .NET 的区别

 所有的优秀程序员都会尽自己的最大努力去使自己所写的程序具有更好的可重用性,因为它可以让你快速地写出更加健壮和可升级性的程序。

  有两种使代码重用的选择:

  1.白盒:最简单的一种,就是把你的程序片拷贝到另一个文件中。
  2.黑盒:它包括把编译过的程序片连接起来。因此客户端可以调用的编译过的黑盒类库就叫作组件。

  .Net中也同样为开发者提供了类似于COM的建立和展开组件的方法。开发人员很容易地被这两种以组件为基础的开发模型所迷惑,所以,让我们来看一看这些不同的开发方法,以使我们消除疑惑。

  COM的产生

  在以前程序设计过程中,程序员把它们的函数库放在一个叫做目标(Object)文件的单独文件中,在这些文件中,包含了编译过的代码。当程序员要使用一个特别的目标文件的时候,他们把客户程序编译成机器代码,然后依靠动态链接的手段把客户程序联接到目标文件上,最后变成一个单一的可执行文件。这种作法的唯一的好处在于它节省了编译函数库的时间。但是它有许多的缺点,比如由于在每个单独的可执行文件中都有一个程序库包括在里面,浪费了许多存储空间;对应用程序的维护也是非常困难的,如果在函数库中发现了一个bug,整个可执行文件都要被重新编译和分发。

  还有不只一个的严重的限制在里头,一个客户应用程序必须要和用同一种语言编制的函数库在一起才能使用。比如说,一个用QuickBasic写的客户应用程序就不能引用一个用C++写的函数库。

  因此,微软公司出品了COM,COM仅仅只是一个规范。不管组件用什么语言写成,只要符合这个COM规范,就能被用任何一种语言写成的客户程序调用。此外,程序员不必再担心要去建立一个单一的可执行文件,因为组件是以GUID(Global Unique Identifier全球唯一标识符)来标识的。GUID是一个128位的号码,和一些相关的信息一起被放在系统的注册表中,用来唯一标识组件。客户应用程序只在运行期间才动态地建立一个组件的实例,并使用这个组件的功能,因此,只需要一个函数库的拷贝。

      它的缺点就是大家常常提到?"DLL地狱"。这个问题在一个DLL要被一个新版本的DLL所取代时引发。开发者不得不通过关闭所有的客户应用程序的方法(如果不行,还要关闭WWW服务)来达到清除所用对这个组件的引用的目的。有时所有的方法都还起不了作用,那你只好重新启动服务器后才能替换掉老的DLL。

  COM+

  为了让企业级的应用程序能使用上COM,它必需要有以下的特定的能力。

  · 验证能力
  · 对象池(Object Pooling)
  · 事务处理
  · 支持分布式架构

  为了使开发者不必去为他们的组件添加这些能力,微软公司出品了DCOM(Distributed COM分布式COM)和MTS(Microsoft Transaction Server微软事务服务器)。使用这两种技术,开发者就可以把精力用在他们的商业逻辑上,而不必放在后台的他们的组件上。

  DCOM是一个用于分布式的组件之间的通讯的RPC(Remote Procedure Call)协议。客户端向一个本地机的代理类发送请求,然后由代理类将这个请求隐含地给安装在远程机器上的"根"类,然后执行结果原路送回给代理类,最后代理类把它们回送给客户端。因此,客户程序的位置完全与组件的位置无关。DCOM的缺点在于,由于DCOM使用的是一个独立的硬件端口,而不是HTTP协议的80端口,所以在组件间通讯的过程中,必须保证这个端口是开着的。这是一个严重的安全问题。所以DCOM不能够轻易地穿越防火墙。

  为了使用MTS,程序员在它们的组件里放置特别的MTS钩子,编译后把他们放在MTS包中。把有关系的组件放在一个单一的包中有它自己的好处。当客户请求一个包中的一个组件的一个实例的时候,MTS确保为这个包建立一个新的专门的线程,一个新的组件实例被建立在这个线程上并被应用事务服务。至于对象池服务和安全服务是否要被建立,那就要看开发者的请求了。

  MTS允许相关的作业单元被当作一个事务来对待,这意味着如果所有的作业单元被成功地完成,整个事务就被当作成功地完成,反之如果有一个单元未成功完成,整个事务将被重新轮回。

  在客户请求对象和释放对象后,MTS仍保存着这个对象,所以当另一个客户请求同一个组件的时候,MTS就将保存着的对象交给它。通过这种方式,MTS减少了在服务器源实例化的次数。

  MTS允许开发者用安全措施来组装他们的组件,以使其具有识别请求它的服务的客户的能力。这能够确保未经授权的客户不能够使用组件的功能。

  MTS以COM+的名义被完整地整合到了微软公司的Windows 2000操作系统中,但是COM+不仅仅只有MTS,它还包括一些其它的服务。MSMQ(Microsoft Message Queue Server),一个与MTS一同发布的服务,也被以COM+的名义整合到了Windows 2000中。MSMQ允许服务器端和客户端进行同步的通讯。事件服务(Event Service)也被加了进来,它使服务器能够与客户端同步地交流事件的发生。负载平衡服务(Load Balancing)自动地实例化机器上的具有最多资源的服务器上的请求对象。

  .NET

  .Net提供了一种全新的建立和展开组件的方法。它就是大名鼎鼎的Assemblies。使用COM,开发者必需要在服务器上注册组件,这也就是说,系统注册表中的组件的信息必须被更新。这样做的目的是保证组件的中心位置,以使COM+能够找到合适的组件。使用.Net的Assemblies,装配(Assembly)文件把所有需要的元数据(meta data)都压入一个叫Manifests(名单)的一个特殊的段中。在.Net中,要使assembly对用户有效,只要简单地把他们放在一个目录中就行了。当客户程序请求一个特别的组件的实例的时候,.Net运行期(runtime)在同一个目录搜寻assembly,在找到后,分析其中的manifest,以取得这个组件所提供的类的信息。由于组件的信息是放在manifest里的,所以开发者就没有必要把组件注册到服务器上,因此,就可以允许几个相同的组件安全地共存在一个相同的机器上了。

  建立一个.Net assembly并不像建立一个VB6组件,唯一让开发者操心的就是商业逻辑,所有的后台代码全部由.Net运行期产生,而且由于.NET运行期具有碎片收集器的功能,组件不必担心它的引用数目(在COM中是靠Iunknown的帮助)。简单地说,在.NET中建立一个assembly比建立一个VB6 COM要简单地多。

  纯的.NET assemblies不能够在COM+服务下注册,因为它们是和COM不同的二进制标准。面对.NET,assemblies的前景相对于COM来说是"高级的COM"。但是由于当前架构于COM+上的应用程序的可靠性,COM还会持续一段时间。这也许就是微软公司向开发者同时提供开发.NET assemblies和COM的工具的原因吧。

  类型库引入器(Type Library Importer (TLBIMP.exe))工具可以把COM组件封装成.NET,以使以前的东西可以在.NET应用程序中继续使用。

  类型库导出器(Type Library Exporter (TLBEXP.exe))工具将.NET组件封装成COM,这个工具也是很有用的,如果你要用你的.NET assemblies去替换原有的COM组件,就得用到它了。由COM+提供的服务不能被忽略,所以把.NET assemblies封装成COM组件就变得相当重要了。作为一种选择,开发者可以从.NET基础类库中选择更多的功能。

 

 

COM组件和。NET组件的区别
COM组件有独立的类型库文件,而。NET组件是通过使用程序集清单来进行自我引用
COM组件基于接口进行通信,而。NET组件直接通信,不通过中间接口查询
COM组件必须在注册表中注册GUID项,。NET组件却不需任何手工注册
COM组件没次可以而且只能注册一个版本,。NET组件可以并存

 

转载于:https://www.cnblogs.com/SissyNong/archive/2009/06/28/1512527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mfc在运行的时候为什么没有实例化_为什么不建议把数据库部署在Docker容器内?...

本文同步Java知音社区,专注于Java原文:https://www.toutiao.com/i6805798581971190276/近2年Docker非常的火热,各位开发者恨不得把所有的应用、软件都部署在Docker容器中,但是您确定也要把数据库也部署的容器中吗?这个…

php 获取指定时间 次日,PHP时间判断语句

用php只能获取服务器端的时间,得用js获取客户端时间,然后生成对应的css文件内容。为了确保页面能正确显示,还得有个默认的css文件链接。示例代码如下:function DynamicLoad(){var Selfthis; //对象自身//功能:加载指定…

泛型的优势

假设需要一个两个整形变量交换的函数,我们很快就可以嗒嗒嗒嗒的敲出下面的 Swap 函数:void Swap(ref int lhs, ref int rhs){int temp lhs;lhs rhs;rhs temp;}随着项目进展,我们发现,需要用到 Swap 函数的不仅是整形,变量 还有…

老男孩python全栈开发视频教程_老男孩Python全栈开发(92天全)视频教程 自学笔记08...

day8课程内容:文件操作fopen(小重山,r,encodingutf8)     #以读的方式打开文件dataf.read()print(data)f.close() #关闭文件句柄fopen(小重山2,w,encodingutf8)    #以清空再写 的方式打开文件,这一步就将文件以前的内容清空了,如果…

php echo 后必须die,die 提示的消息都去哪了?

小弟新手:$fpfopen("./readme.txt","r") or die("不能打开该文件");想问下,如果打开失败,那么die 的这条消息输出到哪了啊?貌似打开失败界面也没有直接弹出这条消息?请问使用die这条消息…

BSTR、char* 和 CString 之间的转换 (转)

BSTR、char* 和 CString 之间的转换 (1) char*转换成CString 若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如: char chArray[] "This is a test"; char * p "This is a test"; 或 LPSTR …

python打开音频文件_Python处理音频文件的实用姿势

每天叫醒我的不是理想,是楼下广场舞的音乐。音乐是人类的通用语言,不分国界不分种族。抖音短视频爆火的关键因素之一,就是普通人也能便捷地使用BGM表达自我。从感性角度看,音乐可以有很多种解释,如:音乐是有…

java三路快排,java二路快排很慢

老师,以下是我二路快排的java代码public class quickSortTwoway {public quickSortTwoway() {};public static void quickSort(Integer[] arr) {__quickSort(arr, 0, arr.length - 1);}private static void __quickSort(Integer[] arr, int l, int r) {if(l > r)…

Web开发常出现的错误[个人收集]

获取DataGrid中的每行中的第一行的第一个textbox (有点老,但用的到) publicabstractclassHelper { publicclassConvert { publicstaticTextBox ToTextBox(Control control) { TextBox tb control asTextBox; …

系统分析师资料_如何成为一名数据分析师?

随着大数据的逐渐普及,数据分析越来越普遍应用到各个职能岗位,也就是说,不论你在哪个行业,都会需要数据分析技能。数据岗位的薪资水涨船高,成为目前最有潜力的职业选择之一。根据猎聘发布《猎聘2019年中国AI&大数据…

matlab中ode45如何设置,如何使用Matlab中的ode45修正赋值错误(ode45函数的第488行)

我正在写一个脚本ode45为了整合卫星在火星附近双曲线轨道上的运动方程.我需要整合地球上的整个通道:从SOI半径开始(576000km)向行星前进,然后穿过大气层直到卫星到达opposite“大气边界(设置在250km从表面)。当它接收到输入A时tspan比大约高200000秒(我需要大约400000秒),Matla…

PL/SQL Developer 使用技巧小结(转)

1,右键菜单在PL/SQL Developer(下面简称PLD)中的每一个文本编辑窗口,如SQL Window,Command Window和Porgram Window,右键点击某个对象名称,会弹出一个包含操作对象命令的菜单,我们这…

设置文本区域大小_数据验证基本设置技巧

数据验证可以规范用户的文本及数字输入格式,如只能输入指定区间的数值、只能输入文本数据、限制输入空格、限制输入重复值等。设置了数据验证条件后,对符合条件的数据允许输入,对不符合条件的数据则禁止输入。因此,利用此设置可以…

丁丁的生日

7月1日是丁丁的生日,本来计划得很好,下午去给他照相,晚上请一家人吃个饭,然后再去看《变形金刚2》(当然这个没有丁丁的份)。 谁知道计划真的赶不上变化,本来好好的丁丁上午突然有些低热-37.8&am…

mysql5.7修改root密码_七小服公开课EMC isilon修改丢失的root密码

1、连接串口,并重启2、在终端上,当引导过程中看到如下提示符时,按下空格键:Hit [Enter] to boot immediately, or any other key for command prompt.3、在OK提示符下,运行以下命令:boot -s4、看到 "Enter full pathname of …

textbox matlab,matlab gui 编程文本框更新

本帖最后由 350954832 于 2014-12-6 07:38 编辑我也是个新学matlab的菜鸟,有些东西也是不是特别的明白,这个程序本来是一个界面 我想通过点击运行按钮,在左边的文本框里面显示te1这个数组,但是点击运行这个按钮以后文本框没有更新…

张向东:就以当年期望别人对我们那样的方式

这几天,在北京广州办公室的电梯里,不断遇到来报道的新同事,又开心又担心。开心当然是新同事加入,担心是因为很多方面,我们还在学习中,团队文化、职业化程度都还不够,特别对刚刚毕业的大学生来说…

python怎么看内置模块_Python的内置模块详解

一、什么是模块模块就是封装了一些列功能的py文件,我们使用的时候直接导入这个文件,通过传入参数的方式使用其他文件的功能函数二、模块有哪些内置模块自定义模块第三方模块三、如何导入模块导入模块分为4种:1 #导入模块2 importmode_test3 #…

matlab人工神经网络代码,咨询BP人工神经网络MATLAB实例代码

我想用BP人工神经网络做个预测,已知2000-2012的值,预测2013-2020年的,数据如下:0.410.430.440.450.500.510.550.610.650.610.670.750.72用前三年的预测第四年的,写了MATLAB代码,但效果不好,所以…

[转]SQL语句资料

--语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据--数据定义CREATE TABLE --创建一个数据库表DROP TABLE --从数据库中删除表ALTER TABLE --修改数据库表结构CREATE …