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

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

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

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

  COM的产生

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

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

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

  1. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  2. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  3. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  4. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  5. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  6. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  7. python二进制打开(rb)和文本格式打开(r)什么区别?

    使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...

  8. python中__dict__与dir()区别

    前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...

  9. java和C#面向对象的区别

    问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...

  10. 判别模型和生成模型的区别

    20210703 https://www.zhihu.com/question/20446337 机器学习"判定模型"和"生成模型"有什么区别? 重点 http ...

最新文章

  1. music算法_Elasticsearch系列---相关性评分算法及正排索引
  2. Java私有方法解释_java接口中 定义 private 私有方法
  3. 实验吧逆向catalyst-system——WP
  4. 服务器安装mysql文档_Linux 服务器安装MySQL数据库
  5. 25个创新的仪表板(管理面板)设计示例
  6. FabFilter Total Bundle 2021 for Mac - 经典效果器合集(2022版)
  7. Scrum实践:每日站会
  8. 学前端整理的前端常用代码,希望会对大家有用
  9. Linux tar 打包
  10. 计算机屏幕上的显示记录,什么样的桌面日历便笺既可以显示日期又可以提醒我所记录的时间表...
  11. python生成word目录_Python word_cloud导出字体路径后找不到字体路径
  12. 厦门大学计算机考研2020分数线,厦门大学2020考研分数线已公布
  13. [极客大挑战 2019]Http 1(修改HTTP请求包)
  14. Windows系统不得不用的神奇热键
  15. RBF技术实现“双花漏洞”研究
  16. 网站漏洞整改报告公司之攻防方案
  17. pycharm如何打开历史_如何在pycharm中反转控制台历史顺序以进行复制粘贴?
  18. 鹏业安装云算量免费使用,只需这几步
  19. adb shell cmd appops
  20. 泛型在Android中的应用

热门文章

  1. 五子棋AI 算法——极大极小搜索
  2. 清华大学出版社c语言程序设计第五版,清华大学出版社-图书详情-《C程序设计教程(第5版)》...
  3. 内网穿透渗透小白初级基础(二)之sock5 代理
  4. C++ Vecter
  5. 自动控制原理---时域
  6. 雨林木风工具最新万能 GHOST 系统制作教程
  7. 【书单】可能会写很久,不过稍有规模时候,就会放送
  8. java课程设计家庭财务管理系统_家庭财务管理系统设计方案与实现.doc
  9. 从“多品牌”到“多品类”,家电行业的颠覆才刚开始
  10. jq和js用mousemove获取鼠标当前位置