【问题标题】:VB.NET Track COM RCW errorVB.NET Track COM RCW 错误
【发布时间】:2014-03-16 20:22:46
【问题描述】:

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

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

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

【问题讨论】:

  • 是否有可能得到另一个与此相关的错误?如果一个未指定的 COM 失败,你能通过其他错误找出它是哪一个吗?你能在 Visual Studio 中复制这种行为吗?
  • 每次都会发生。我不确定您所说的“与此相关的另一个错误”是什么意思。一切正常,但我收到此错误。
  • 您是否添加了任何 ActiveX 控件。右键单击工具箱,然后选择项目。然后点击COM选项卡,看看有没有勾选,这个最好勾选。
  • 你有任何代码在处理程序“Me.FormClosing”或“Me.FormClosed”上运行
  • 您是否碰巧在代码(或您直接或间接引用的任何代码)中的任何位置调用 Marshal.FinalReleaseComObject?

标签: vb.net com rcw


【解决方案1】:

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

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

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

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

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

您可能想阅读this blog,以便更好地了解 RCW 的工作原理并帮助您解决问题。

编辑

看了你的评论,我觉得我应该补充两个可能的原因:

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

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

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

【讨论】:

  • 谢谢。我以其他方式解决了这个问题......不确定真正的原因是什么,但我删除了所有 Microsoft.VisualBasic 运行时方法,然后 RCW 错误突然消失了。否则我会按照您的建议追踪错误(一一删除控件)。
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多