模拟 COM 接口
COM 可调用包装 (CCW) 将按照 COM 在实施基于接口的交互时所采用的方式,向 COM 客户端公开所有公共的、COM 可见的接口、数据类型和返回值。 对于 COM 客户端而言,对 .NET Framework 对象调用方法相当于对 COM 对象调用方法。
为了创建这种无缝的方法,CCW 将创建传统的 COM 接口,如 IUnknown 和 IDispatch。 如下图所示,CCW 对它所包装的 .NET 对象持有单个引用。 COM 客户端和 .NET 对象将通过 CCW 的代理及存根 (stub) 结构来与对方进行交互。
COM 接口和 COM 可调用包装
除了公开由托管环境中的类显式实现的接口之外,.NET Framework 还提供了代表对象实现下表所列 COM 接口的途径。 通过自行提供这些接口的实现,.NET 类可以重写默认的行为。 不过,运行时始终会提供 IUnknown 和 IDispatch 接口的实现。
接口 |
说明 |
---|---|
Idispatch |
提供用于后期绑定到类型的机制。 |
IerrorInfo |
提供错误的文本说明、错误来源、帮助文件、帮助上下文以及定义错误的接口的 GUID(对于 .NET 类始终是 GUID_NULL)。 |
IprovideClassInfo |
使 COM 客户端能够访问托管类所实现的 ITypeInfo 接口。 |
IsupportErrorInfo |
使 COM 客户端能够确定托管对象是否支持 IErrorInfo 接口。 如果支持,则使客户端能够获取指向最后一个异常对象的指针。 所有托管对象都支持 IErrorInfo 接口。 |
ItypeInfo |
提供类的类型信息,该信息与 Tlbexp.exe 生成的类型信息完全相同。 |
Iunknown |
提供 IUnknown 接口的标准实现,COM 客户端将利用该实现来管理 CCW 的生存期并提供类型强制。 |
托管类还可以提供下表所述的 COM 接口。
接口 |
说明 |
---|---|
(_classname) 类接口 |
已由运行时公开且未显式定义的接口,它公开在托管对象上显式公开的所有公共接口、方法、属性和字段。 |
IConnectionPoint 和 IconnectionPointContainer |
指明基于委托的事件出处的对象的接口(用于注册事件订户的接口)。 |
IdispatchEx |
在类实现 IExpando 时由运行时提供的接口。 IDispatchEx 接口是 IDispatch 接口的扩展,但与 IDispatch 不同的是,它启用成员的枚举、添加、删除和区分大小写的调用。 |
IEnumVARIANT |
集合类型类的接口,它在类实现 IEnumerable 时枚举集合中的对象。 |