COM 包装

COM 在多个重要方面与 .NET 运行时对象模型不同。

  • COM 对象的客户端必须管理这些对象的生存期;公共语言运行时管理其环境中的对象的生存期。

  • COM 对象的客户端通过对提供服务的接口发出请求并取回接口指针来发现服务是否可用。 .NET 对象的客户端可以使用反射获取对象功能的说明。

  • NET 对象驻留在由 .NET 运行时执行环境管理的内存中。 执行环境可以出于性能原因在内存中移动对象,并更新对它移动的对象的所有引用。 非管理的客户端在获取指向对象的指针后,依赖于该对象以保留在相同位置。 这些客户端没有处理其位置未固定的对象的机制。

为了克服这些差异,运行时提供了包装类,使托管和非托管客户端都认为他们在各自的环境中调用对象。 每当托管客户端对 COM 对象调用方法时,运行时将创建 运行时可调用包装器 (RCW)。 除此之外,RCW 还会提取托管和非托管引用机制之间的差异。 运行时还会创建 COM 可调用包装器 (CCW)来反转进程,使 COM 客户端能够在 .NET 对象上无缝调用方法。 如下图所示,调用代码的角度决定了运行时创建的包装类。

COM 包装器概述

在大多数情况下,运行时生成的标准 RCW 或 CCW 可以为跨越 COM 和 .NET 运行时边界的调用提供足够的封送处理。 使用自定义属性,可以选择调整运行时表示托管和非托管代码的方式。

另请参阅