我在做单元测试。“已经与其基础RCW分离的COM对象无法使用”?
我在我的解决方案中有2个项目1是库项目,1是测试项目。 库项目有一些com组件。而测试项目正在测试图书馆项目中的功能。而这些库函数正在使用这些com对象。
第一个单元测试执行成功,但当我尝试执行2个单元测试,然后在第二个单元测试中,我收到错误“COM对象已经从其基础RCW分离不能使用”,当我尝试访问这些COM对象。
我在做单元测试。“已经与其基础RCW分离的COM对象无法使用”?
我在我的解决方案中有2个项目1是库项目,1是测试项目。 库项目有一些com组件。而测试项目正在测试图书馆项目中的功能。而这些库函数正在使用这些com对象。
第一个单元测试执行成功,但当我尝试执行2个单元测试,然后在第二个单元测试中,我收到错误“COM对象已经从其基础RCW分离不能使用”,当我尝试访问这些COM对象。
这意味着某人正在错误地使用Marshal.ReleaseComObject
,或者更糟的是,使用Marshal.FinalReleaseComObject
。第一个单元测试通过这种相关的副作用影响第二个,也许是以拆卸方法。解决这个问题的第一步是准确找出哪个对象/访问/位置造成该异常。
发生这种情况的原因是,对于COM对象已经释放的RCW(COM ref-count设置为0)调用了一个方法,这意味着ReleaseComObject
被调用次数过多或者FinalReleaseComObject
已被调用。
如果自己一个RCW对象(有“将其纳入CLR”),它的寿命到了,ReleaseComObject
是好的(设置变量null
以及避免再次使用它)。使用FinalReleaseComObject
通常是永远不会有问题因为不可能正确跟踪它的生命周期。诀窍是记住单个RCW对象代表代表一个或多个次,COM对象已被“引入CLR”并具有内部(非COM)计数器。
在很多情况下当GC运行终结器时,GC将正确处理RCW清理。并且当时RCW不可达到,因此不能生成。在需要COM寿命的严格控制(考虑COM对象的“共享”Dispose
)时,[仅]需要/有用明确的ReleaseComObject
。与外接开发Microsoft Office产品:)时,这出现一个好一点的
有在.NET and COM Interoperability : release COM from .NET client额外的细节(我回答)和反文章ReleaseComObject considered dangerous
编码愉快。
你能告诉我如何明确ReleaseComObject。我应该在哪里调用dispose。我不知道关于Idisposable接口。 – 2012-04-16 09:21:14
你*不*调用'Dispose'。 'ReleaseComObject'只能在需要时使用。我只是解释导致这个例外的原因。我的链接响应有关于RCW如何工作以及何时应该使用“ReleaseComObject”以及它具有哪些副作用和问题的更多细节。同样,当代码错误地使用'ReleaseComObject'或'FinalReleaseComObject'时,这个异常会导致:即使底层COM对象被释放(ref-count为0),一个RCW对象(这是一个.NET对象)仍然在浮动*。 。 – 2012-04-16 22:02:21