COM编程之一 组件
【1】组件产生的背景
一个应用程序通常是由单个二进制文件组成的。
当应用程序版本发布后一般不会发生任何变化,对于操作系统、硬件以及客户需求的改变都必须要等到修复源代码后且整个应用程序被重新编译才可处理。
很显然这种状况极不理想。矛盾总是推动事物向前发展的源动力。
当人们认识到应用程序在发行之后不应该保持那种静止的状态之后,开发人员找出一种方法,以能够给已发行软件不断注入新的活力。
其解决方案就是将单个应用程序分隔为多个独立的部分,每个部分也即组件。如下图所示:
这种做法的好处是可以随着技术及需求的不断发展而只需用新的组件取代已有的组件即可。
COM就是关于如何建立组件以及如何通过组件构建应用程序的规范。
传统的做法是将应用程序分割为文件、模块或类,然后将它们编译并链接成一个铁板一块的应用程序。而由组件建立应用程序的过程称为组件架构。
组件架构最引人注目的优点之一是快速应用程序开发。
【2】何谓分布式组件?
所谓分布式组件,组成应用程序的组件不一定都在一个机器上,可以在网络上任意的一台机器。如下图所示:
【3】对组件的要求?
组件的优点直接来源于可以动态的将它们插入或卸出应用程序。为了实现这种功能,组件必须满足两个条件:
1、组件必须动态链接。
2、组件必须隐藏其内部实现细节,对客户完全透明。
【4】为了将客户与组件相应隔离对于组件有哪些限制?
1、组件必须封装其所用的编程语言。任一客户都应能使用任一组件,不论它们是用什么编程语言实现的。
将实现用的编程语言暴露出来只会在组件及客户间引入新的依赖。
2、组件必须以二进制的形式发布。如果想将实现组件的编程语言隐藏起来,那么在发布时,它们必须是已被编译、链接好并且马上就可以投入使用的。
3、组件必须可以在不妨碍已有用户的情况下被升级。一个组件的新版本必须既能够同老版本的客户一起使用,也可以同心版本的客户一起使用。
4、组件在网络上的位置必须可以被透明的重新分配。组件及使用它的程序应能够在同一进程中、不同的进程中或不同的机器上运行。
否则,当将某个本地组件移动到网络上的另外某个地方时,客户程序必须被重新编译。
【5】COM组件是什么?
1、COM组件是以Win32动态链接库(DLL)或者可执行文件(EXE)的形式发布的可执行二进制代码所组成的。
2、COM组件是动态链接的。
3、COM组件是完全与语言无关的。
4、COM组件是可以在网络上透明的被重新分配位置的。
5、COM组件是在兼容老客户的情况下悄然升级的。
6、COM组件是一种给其它应用程序提供面向对象的API或服务的极好方法。
理解COM以下几点:
1、COM不是一种计算机语言。
2、COM不是DLL。
3、COM不是函数集。
4、COM不是类库。
【7】使用COM有那些好处?
1、提供了一个所有组件都应遵循的标准。
2、允许使用组件的多个不同的版本,而这一点对于用户而言几乎是透明的。
3、使得可以按相同的方式来处理类似的组件。
4、定义了一个与语言无关的架构。
5、支持对远程组件的透明连接。
【8】进程内组件与进程外组件?
组件按照执行类型可以有两个基本形式,既可以是进程内组件也可以是进程外组件。
进程内组件就像动态链接库DLL一样,它们与调用组件的应用程序运行在同一块存储空间当中。
也就是说,当ASP应用程序调用DLL时,DLL和该ASP是处于同一存储空间的。
可以从两个方面来说明这样做是有好处的。首先内部调用范围不会超出系统给应用程序分配的存储空间,所以程序将会执行得更快一些。
另外,既然是在同一存储空间,那么组件也就不大可能去破坏其他正在运行的进程,这样进程就有很好的独立性。
第二个优点是如果你有许多组件程序,那么这些物理文件(组件程序)就只需要一次性装载到内存当中就够了。
进程外组件的服务是以一个可执行文件(EXE格式)来实现的,它与调用组件的应用程序是不同的,它们不在同一存储空间里,而且进程外服务使用了更多的资源,
这是因为组件的多个实例要求多次的内存装载。另外进程外服务在自己独立的存储空间运行,所以如果运行失败的话,影响到其他应用程序也是很有可能的。
备注:一个应用程序或者组件,如果它使用了其它组件,相对于被使用的组件而言,我们将它称之为客户。
Good Good Study. Day Day Up.
顺序 选择 循环 总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异