System.Runtime.InteropServices.ComWrappers 类

本文提供了此 API 参考文档的补充说明。

ComWrappers API 支持 IUnknown 独立于内置 COM 互操作性支持的 API。 API ComWrappers 公开了开发人员以高效方式替换内置版本所需的最小运行时支持。

传统上,在运行时中,托管对象的本机代理称为 COM 可调用包装器(CCW),而本机对象的托管代理称为运行时可调用包装器(RCW)。 但是,在此处使用时,不应将这些术语与同名的内置功能(即 CCWRCW)混淆。 与内置功能不同,大多数负责准确的生存期管理、调度方法和封送参数和返回值,留给 ComWrappers 实现者。

“最低支持”由以下功能定义:

  1. 托管对象和本机代理(例如 CCW)之间的高效映射。
  2. 本机 IUnknown 代理与其托管代理之间的高效映射(例如 RCW)。
  3. 通过 IReferenceTrackerHost 接口协定与垃圾回收器集成。

利用这是一个高级方案。

代理状态

本部分提供各自的创建后本机和托管代理状态的说明和说明。

在下图中,强引用被描述为实线(===),弱引用被描述为虚线(= = =)。 术语“强引用”和“弱引用”应解释为“延长生存期”和“不延长生存期”,而不是暗示特定实现。

下图显示了调用 ComWrappers.GetOrCreateComInterfaceForObject(Object, CreateComInterfaceFlags)后托管对象和本机代理的状态。

 --------------------                  ----------------------
|   Managed object   |                |     Native proxy     |
|                    |                | Ref count: 1         |
|  ----------------  |                |  ------------------  |
| | Weak reference |=| = = = = = = = >| | Strong reference | |
| |    to proxy    | |<===============|=|    to object     | |
|  ----------------  |                |  ------------------  |
 --------------------                  ----------------------

下图显示调用 ComWrappers.GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags)后本机对象和托管代理的状态。 “标识”的概念遵循规则IUnknown

 ------------------               ------------------
|  Native object   |< = = = = = =|                  |
| Ref count: +1    |             | Mapping from     |
 ------------------              | native identity  |
 ------------------------        | to managed proxy |
|   Managed proxy        |< = = =|                  |
| Created by ComWrappers |        ------------------
|   implementer.        |
| Optional AddRef() on   |
|   native object.      |
 ------------------------

请注意,从运行时的角度来看,只有弱引用存在。 +1假定本机对象的引用计数由托管代理创建者(即ComWrappers实现者)执行,以确保本机对象与其托管代理之间的关联生存期。 托管代理中有一个可选的强引用(即AddRef())提及,该引用用于支持前面提及的方案(3)。 请参阅 CreateObjectFlags.TrackerObject。 使用此可选强引用时,引用计数将为 +2