COM简单来说在不同应用和语言之间提供了一种二进制代码级分享途径的方法。这和C++重用代码有很大不同,C++只是提供了一种源代码级的 代码重用(ATL就是一个很好的例子)它的调用者只能使用C++语言,C++这种重用代码缺点是带来了命名冲突,同一工程中多份代码copy导致代码臃肿等。

COM定义了一种二进制规范,这个规范规定了二进制模块必须按照一定的结构编译,同时也规定了COM对象在内存中的存储方式。由于COM对象在内存中的结

构和C++虚函数的结构碰巧一样,所以大量的COM源码都是C++语言编写的,但需要强调的是,COM的开发与语言无关,任何语言都可以用来编写COM组件,同

时COM也不是Win32程序独享的,他是跨平台的,他可以被引进任何其他操作系统。

COM组件的发行者会提供给调用者类型库和主互操作程序集,COM通过互操作程序集暴露自己的接口信息给其他组件以供调用。互操作程序集包含一个命名空间,在该命名空间下,是COM对象模型中每个COM对象的托管对等接口。托管代码可以通过这个托管接口调用非托管的COM对象。当使用VS引入一个COM组件时,VS将自动生成互操作程序集的本地副本。调用者可以通过互操作程序集中描述COM组件的元数据来直观的看到COM组件中包含的类和方法。而编译的时候将用托管程序集中有关COM对象的信息编译托管项目。

当.net组件调用COM客户端

.net对象无法直接于COM组件进行交互,因为.net应用并不能理解COM互操作程序集所暴露接口信息,所以COM组件必须被打包成一种.net应用所认识的东西,这种东西就是RCW(Runtime Callable Wrapper)运行时可调用包装。.NET Framework CLR 将为托管客户端所交互的每个 coclass 也就是COM组件创建一个RCW 通过RCW把COM的组件暴露给.net应用。请注意,无论客户端从 coclass 获得了多少个接口,运行时只为每个 coclass 创建一个 RCW。RCW 是和 COM coclass 有关的 .NET Framework 类的类型。RCW 可跟踪 coclass 的实例,并且仅在客户端不再需要 RCW 时才释放对这些实例的引用(而托管代码需要垃圾收集器)。因此,托管客户端不必按照 COM 下非托管客户端的方式来管理对象生存期。在运行时,RCW 从托管客户端截获 API 调用,并使用互操作程序集信息以透明方式将该

调用映射到 COM coclass 中的相应 API。

当COM客户端调用.NET组件时

.NET工程是基于对象进行通信的,这种通信方式COM肯定不会理解。这就需要一种机制把.net组件打包生成一种COM能够理解的东西,这种东西叫做CCW (COM Callable Wrapper )Com可调用包装,CCW把.net组件打包并且与COM进行交互。

由上可以看出COM和.net组件的区别,而RCW和CCW通过将这些不同包装统一起来进行通信。

.NET
COM
基于对象通信
基于接口通信
使用垃圾回收机制管理内存
使用接口引用管理内存
通过new关键字生成对象
通过coCreateInstance生成对象
返回异常
返回HRESULT
对象信息在程序集里
对象信息在类型库里
类型标准对象
二进制标准对象

 

Reference:

http://www.codeproject.com/Articles/633/Introduction-to-COM-What-It-Is-and-How-to-Use-It

http://www.codeproject.com/Articles/5001/NET-COM-Interoperability

http://msdn.microsoft.com/zh-cn/library/bb610378.aspx

http://msdn.microsoft.com/zh-cn/aax7sdch

http://baike.baidu.com/view/370167.htm

Book:

《COM技术内幕》

学习笔记:http://blog.csdn.net/benkong2008/article/category/497601

 

posted on 2012-05-21 11:00  salomon  阅读(1866)  评论(0编辑  收藏  举报