VB.NET跟踪COM RCW错误

时间:2014-03-16 20:22:46

标签: vb.net com rcw

我有一个非常大的项目,我不能轻易删除。

当应用程序关闭时,我收到错误

"InvalidComObjectException: A COM object that has been disconnected from the RCW can not be used."

详细说明:

System.Runtime.InteropServices.InvalidComObjectException has occured.
  HResult=-2146233049
  Message=A COM object that has been disconnected from its RCW can not be used.
  Source=mscorlib
  StackTrace:
       at System.StubHelpers.StubHelpers.StubRegisterRCW(Object pThis)
  InnerException: 

不幸的是我无法看到这是什么COM对象。 有谁知道我怎么能找到它?不幸的是,我无法阅读ASM来分析反汇编。

1 个答案:

答案 0 :(得分:9)

您可以尝试一些步骤,因为您没有发布任何代码,我会尝试列举一些最常见的关键因素...

首先,处理对象时没有顺序。如果调用close / dispose / finalize操作,对象C 可能会在对象A 之前处置,如果某个对象仍处于活动状态,则可能会尝试访问已经处置的对象。

其次,要小心事件。获取有关访问源自事件调用的已处置对象的错误是很常见的。

第三,不要将对象放在事件范围内,也不要放在析构函数中。创建自己的方法来释放对象。

由于你不知道哪个COM对象是罪魁祸首,我建议你寻找你关闭,处理,断开连接等的那些......

您可能需要阅读this blog,以便更好地了解RCW的工作方式,并帮助您解决问题。

修改

在阅读你的评论后,我觉得我应该添加两个可能的原因:

  • 如果在删除Microsoft.VisualBasic runtime methods之后你已经解决了问题,那么我怀疑在这些方法中的一个或多个,你已经将参考计数增加到一个或多个COM(s)并没有正确发布。 确保ReleaseComObject检查引用计数直到它为0,然后将其设置为(VB)或 null (C#)并让垃圾收集器执行其余部分。

  • 另一个选项是其中一个方法试图访问已经处理的COM对象引用,导致RCW错误,因为不再可调用。

作为最终评论,在释放COM对象后始终将其设置为 nothing null ,这将释放对变量的引用,您可以随时检查它的可用性代码中的任何地方。