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

分享我在工作中遇到的多线程下导致RCW无法释放的问题 最近在做项目中遇到一个问题,在调用一个类库中的方法时,出现如下异常信息:尝试释放正在使用RCW,活动线程或其他线程上正在使用RCW,释放正在使用RCW 的尝试会导致损坏或数据丢失 立即下载

RCW是一个.NET和COM之间的桥梁,上述错误就是在于COM那一段的陆地消失了,你再想走着这桥,系统就报错了,
这种问题多半是COM对象被意外销毁或者没有抛出异常就崩溃导致。  

解决问题是:肯定是系统对象在运行时某个地方,局部销毁了,在传入时,可用引用对象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 对象可以当作集合来进行处理。  

如何解决:COM对象与其基础RCW分开后就不能使用 使用VS2010的时候,有时候会出现“COM 对象与其基础 RCW 分开后就不能使用。”的错误,可是我们什么都没有做,为什么会这样,网上的资料大都是在介绍和解释什么是RCW,讲的是.NetCOM互操作的一些相关知识,但是我们今天的重点是如何解决“COM对象与其基础RCW分开后就不能使用”的问题,使用了各种方式,有种方式最起作用:重新引用Microsoft.CSharp命名空间。 1、先删除... 阅读详情

相关推荐

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

操作ArcEngine中的COM对象时,为了减少内存的增长,用掉的对象要手动释放常用的方法是ReleaseComObject System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj); 但有时会报"COM对象与其基础RCW分开后就不能使用"错误。这是因为对象被释放了,再去引用就找不到了,所在释放对象固然好,但要分清楚。...

weixin_34061482的博客 844

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

RCW是一个.NETCOM之间的桥梁,上述错误就是在于COM那一段的陆地消失了,你再想走着这桥,系统就报错了, 这种问题多半是COM对象被意外销毁或者没有抛出异常就崩溃导致。  解决问题是:肯定是系统对象在运行时某个地方,局部销毁了,在传入时,可用引用对象ref,out 说明: 运行库可调用包装 (RCW) 的主要目标是隐藏托管和非托管编程模型之间的差异。要实现无缝的转换,RC

wmg494005678的专栏 3万+

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

代码中可能是释放了对象,又使用了。 例如可能有这一句 System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj); 使用的位置不对,已经释放了,后面在引用就失败了。使用完再释放就行了。 引用自《COM对象与其基础RCW分开后就不能使用》 --------------------------...

weixin_30279751的博客 348

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

在实现遍历工作空间下所有数据集以及数据类中遇到的错误,出错代码:  pDataset = pEnumDataset.Next();                 if (pDataset != null)                 {   .... Marshal.ReleaseComObject(pDataset);                         pData

爱莫能助 9555

tfrcw函数用法,已从其基础RCW分开COM对象不能使用

I have some COM component which I call from some c# dll.I also have a winforms app that uses that .dll.When I close the app I get this exception:COM object that has been separatedfrom its underlying R...

weixin_31066503的博客 333

com 对象与其基础 rcw 分开后就不能使用_Java 基础入门(二)

在Java基础入门(一)里,我们已经学习了java的基本程序结构和基础语法,下面我们就来学习java面向对象(OOP)的语法。当然最重要的理解面对对象编程思想,以便读者将来学习其他面对对象的语言时能触类旁通。面向对象的具体概念及和面向过程的区别网上有很多,在这里简单说下面向过程和面向对象的理解:面向过程:是站在计算机的角度去抽象问题和解决问题。以实现一个简单的贪吃蛇游戏为例,利用面向过...

weixin_39933336的博客 337

HOW TO:避免“将COM对象与其基础RCW分开不能使用对象”错误

Author:水如烟  出现这个情形,是在重写了Finalize并在里面含有调用Com对象的代码,同时在销毁对象前没有显式释放Com对象。解决的办法是,显式调用释放代码。如:Public Sub Quit() ...End SubProtected Overridable Sub Dispose(ByVal disposing As Boolean)    If Not Me.

水如烟 7184

com 对象与其基础 rcw 分开后就不能使用_Python 零基础入门-阶段一

参考书目:FIT9133 textbook from Alexandria, Monash University(AU)目录章节介绍与准备2. python基础3. 数据结构,数据存储类型,控制结构1. 介绍与准备1.1 介绍Python是一门高级编程语言,其他比如C,C++,Java,Ruby,GO,Julia等等。它的特点就是:入门简单,external package全面,而且还在不断更新,...

weixin_32309649的博客 809

com 对象与其基础 rcw 分开后就不能使用_如何从零基础学会滑行?!

原来用电脑编辑才有题图,恩,这是一次久违的更新。笔者2006年开始就参与到轮滑教学工作中,寒暑假少有间断,积累了一些自学经验和专业队训练经验。在此与各位分享探讨,精益求精,让自由式轮滑教学的相关细节更加明确清晰,让后来者少走弯路。转载请注明出处哦==================================从零基础学会滑行将会分三部分进行讲解1、步行与滑行的区别2、自学的最精简步骤3、轮滑班...

weixin_34462016的博客 217
上一篇: C# System.Guid.NewGuid()格式化
下一篇: CultureInfo 类
fcluser
博客等级 码龄19年 5粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值