2012-04-16 24 views
1

我在做单元测试。“已经与其基础RCW分离的COM对象无法使用”?

我在我的解决方案中有2个项目1是库项目,1是测试项目。 库项目有一些com组件。而测试项目正在测试图书馆项目中的功能。而这些库函数正在使用这些com对象。

第一个单元测试执行成功,但当我尝试执行2个单元测试,然后在第二个单元测试中,我收到错误“COM对象已经从其基础RCW分离不能使用”,当我尝试访问这些COM对象。

回答

1

这意味着某人正在错误地使用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

编码愉快。

+0

你能告诉我如何明确ReleaseComObject。我应该在哪里调用dispose。我不知道关于Idisposable接口。 – 2012-04-16 09:21:14

+0

你*不*调用'Dispose'。 'ReleaseComObject'只能在需要时使用。我只是解释导致这个例外的原因。我的链接响应有关于RCW如何工作以及何时应该使用“ReleaseComObject”以及它具有哪些副作用和问题的更多细节。同样,当代码错误地使用'ReleaseComObject'或'FinalReleaseComObject'时,这个异常会导致:即使底层COM对象被释放(ref-count为0),一个RCW对象(这是一个.NET对象)仍然在浮动*。 。 – 2012-04-16 22:02:21

相关问题