COM 可调用包装
当 COM 客户端调用一个 .NET 对象时,公共语言运行时将创建托管对象以及该对象的 COM 可调用包装 (CCW)。 由于无法直接引用 .NET 对象,COM 客户端会将 CCW 用作托管对象的代理。
运行时只为每个托管对象创建一个 CCW,而不管有多少个 COM 客户端在请求其服务。 如下图所示,对于公开 INew 接口的 CCW,多个 COM 客户端可以持有引用。 而该 CCW 又对实现接口的托管对象持有单个引用,并且会进行垃圾回收。 COM 和 .NET 客户端可以同时对同一托管对象发出请求。
通过 COM 可调用包装来访问 .NET 对象
COM 可调用包装对于在 .NET Framework 中运行的其他类来说是不可见的。 它们的主要用途是封送在托管和非托管代码之间传递的调用;但是,CCW 还管理对象标识及其包装的托管对象的对象生存期。
对象标识
运行时从其垃圾回收堆中为 .NET 对象分配内存,这样,运行时就可以在必要时将对象在内存中来回移动。 与之相对,运行时从非回收堆中为 CCW 分配内存,从而使 COM 客户端可以直接引用该包装。
对象生存期
与它所包装的 .NET 客户端不同,CCW 以传统的 COM 方式来进行引用计数。 当 CCW 上的引用计数达到零时,该包装将释放它对托管对象的引用。 在下一次垃圾回收循环中,将回收无剩余引用的托管对象。
请参见
参考
COM 可调用包装