COM对象与其基础RCW分开后就不能再使用

时间:2022-09-29 13:14:30
RCW是一个.NET和COM之间的桥梁,上述错误就是在于COM那一段的陆地消失了,你再想走着这桥,系统就报错了,
这种问题多半是COM对象被意外销毁或者没有抛出异常就崩溃导致。 
COM对象与其基础RCW分开后就不能再使用

解决问题是:肯定是系统对象在运行时某个地方,局部销毁了,在传入时,可用引用对象ref,out

说明:

运行库可调用包装 (RCW) 的主要目标是隐藏托管和非托管编程模型之间的差异。要实现无缝的转换,RCW 将使用选定的 COM 接口,而不会将其向 .NET 客户端公开,如下图所示。

COM 接口和运行库可调用包装



当作为早期绑定对象创建后,RCW 将成为特定的类型。它实现 COM 对象所实现的接口,并公开该对象的接口中的方法、属性和事件。在上图中,RCW 公开 INew 接口而使用 IUnknown 和 IDispatch 接口。此外,RCW 还向 .NET 客户端公开 INew 接口的所有成员。

RCW 使用下表所列的接口,这些接口由它所包装的对象公开。

接口 说明
IDispatch 用于通过反射晚期绑定到 COM 对象。
IErrorInfo 提供错误的文本说明、错误来源、帮助文件、帮助上下文以及定义错误的接口的 GUID(对于 .NET 类始终是 GUID_NULL)。
IProvideClassInfo 如果所包装的 COM 对象实现 IProvideClassInfo,RCW 将从此接口中提取类型信息,以提供更佳的类型标识。
IUnknown 对于对象标识、类型强制和生存期管理:
对象标识
运行库通过比较每个对象的 IUnknown 接口值来区分 COM 对象。

类型强制
RCW 识别 QueryInterface 方法所执行的动态类型发现。

生存期管理
利用 QueryInterface 方法,RCW 将获取并保留对非托管对象的引用,直至运行库对包装执行垃圾回收并释放该非托管对象。


RCW 选择性地使用下表列出的接口,这些接口由它所包装的对象公开。

接口 说明
IConnectionPoint 和 IConnectionPointContainer RCW 将公开连接点事件样式的对象转换为基于委托的事件。
IDispatchEx 如果类实现 IDispatchEx,RCW 将实现 IExpando。IDispatchEx 接口是 IDispatch 接口的扩展,但与 IDispatch 不同的是,它启用成员的枚举、添加、删除和区分大小写的调用。
IEnumVARIANT 使支持枚举的 COM 对象可以当作集合来进行处理。