1

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

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

"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 来分析反汇编。

4

1 回答 1

9

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

首先,处理对象时没有顺序。如果调用了 close/dispose/finalize 操作,则对象 C可能会在对象 A之前被释放,如果某个对象仍然存在,它可能会尝试访问已释放的对象。

第二,提防事件。访问源自事件调用的已处置对象的错误很常见。

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

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

您可能想阅读此博客以更好地了解 RCW 的工作原理并帮助您解决问题。

编辑

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

  • 如果删除后Microsoft.VisualBasic runtime methods您已经解决了问题,那么我怀疑在这些方法中的一个或多个方法中,您增加了对一个或多个 COM 的引用计数并且没有正确释放。请务必ReleaseComObject检查引用计数,直到它为 0,然后将其设置为( VB) 或null (C#),然后让垃圾收集器完成剩下的工作。

  • 另一种选择是其中一个方法尝试访问已释放的对 COM 对象的引用,从而导致 RCW 错误,因为不再可调用。

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

于 2014-03-21T04:19:28.480 回答