COM 可调用包装

更新:2007 年 11 月

当 COM 客户端调用一个 .NET 对象时,公共语言运行时将创建托管对象以及该对象的 COM 可调用包装 (CCW)。由于无法直接引用 .NET 对象,COM 客户端会将 CCW 用作托管对象的代理。

运行时只为每个托管对象创建一个 CCW,而不管有多少个 COM 客户端在请求其服务。如下图所示,对于公开 INew 接口的 CCW,多个 COM 客户端可以持有引用。而该 CCW 又对实现接口的托管对象持有单个引用,并且会进行垃圾回收。COM 和 .NET 客户端可以同时对同一托管对象发出请求。

通过 COM 可调用包装来访问 .NET 对象

COM 可调用包装

COM 可调用包装对于在 .NET Framework 中运行的其他类来说是不可见的。它们的主要用途是封送在托管和非托管代码之间传递的调用;但是,CCW 还管理对象标识及其包装的托管对象的对象生存期。

对象标识

运行时从其垃圾回收堆中为 .NET 对象分配内存,这样,运行时就可以在必要时将对象在内存中来回移动。与之相对,运行时从非回收堆中为 CCW 分配内存,从而使 COM 客户端可以直接引用该包装。

对象生存期

与它所包装的 .NET 客户端不同,CCW 以传统的 COM 方式来进行引用计数。当 CCW 上的引用计数达到零时,该包装将释放它对托管对象的引用。在下一次垃圾回收循环中,将回收无剩余引用的托管对象。

请参见

概念

COM 包装

模拟 COM 接口

运行库可调用包装

向 COM 公开 .NET Framework 组件

参考

COM 可调用包装