System.Runtime.InteropServices.ComWrappers 类
本文提供了此 API 参考文档的补充说明。
该 ComWrappers API 支持 IUnknown
独立于内置 COM 互操作性支持的 API。 API ComWrappers
公开了开发人员以高效方式替换内置版本所需的最小运行时支持。
传统上,在运行时中,托管对象的本机代理称为 COM 可调用包装器(CCW),而本机对象的托管代理称为运行时可调用包装器(RCW)。 但是,在此处使用时,不应将这些术语与同名的内置功能(即 CCW 和 RCW)混淆。 与内置功能不同,大多数负责准确的生存期管理、调度方法和封送参数和返回值,留给 ComWrappers
实现者。
“最低支持”由以下功能定义:
- 托管对象和本机代理(例如 CCW)之间的高效映射。
- 本机
IUnknown
代理与其托管代理之间的高效映射(例如 RCW)。 - 通过 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
。