VB.NET跟踪COM RCW错误

VB.NET跟踪COM RCW错误,vb.net,com,rcw,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

我有一个很大的项目,我不能轻易地把它删掉

当应用程序关闭时,我得到了错误信息

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

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

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

第二,谨防事态发展。访问源自事件调用的已处置对象时,经常会出现错误

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

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

为了更好地理解RCW的工作原理,并帮助您解决问题,您可能需要阅读

编辑:

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

如果在删除Microsoft.VisualBasic运行时方法后,您已经解决了问题,那么我怀疑在这些方法中的一个或多个方法中,您增加了对一个或多个COM的引用计数,并且没有正确释放。 请确保释放ComObject检查引用计数,直到它为0,然后将其设置为nothingVB或nullC,并让垃圾收集器执行其余操作

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


最后,在释放COM对象后,请始终将其设置为nothing或null,这将释放对变量的引用,并且您可以始终在代码中的任何位置检查它的可用性。

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

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

第二,谨防事态发展。访问源自事件调用的已处置对象时,经常会出现错误

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

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

为了更好地理解RCW的工作原理,并帮助您解决问题,您可能需要阅读

编辑:

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

如果在删除Microsoft.VisualBasic运行时方法后,您已经解决了问题,那么我怀疑在这些方法中的一个或多个方法中,您增加了对一个或多个COM的引用计数,并且没有正确释放。 请确保释放ComObject检查引用计数,直到它为0,然后将其设置为nothingVB或nullC,并让垃圾收集器执行其余操作

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


作为最后一条注释,在释放COM对象后,始终将其设置为nothing或null,这将释放对变量的引用,并且您始终可以在代码中的任何位置检查它的可用性。

是否可能获得与此相关的另一个错误?如果一个未指定的COM失败,您能通过其他错误找出它是哪一个吗?可以在Visual Studio中复制此行为吗?每次都会发生。我不知道你所说的与此相关的另一个错误是什么意思。一切正常,但我遇到了这个错误。您添加了ActiveX控件吗。右键单击工具箱,然后选择项。然后单击COM选项卡,查看是否检查了任何内容,这是最好的检查方法。您是否在处理程序Me.FormClosing或Me.FormClosedDo上运行了任何代码?您是否碰巧在代码或直接或间接引用的任何代码中的任何位置调用了Marshal.FinalReleaseComObject?是否可能出现与此相关的另一个错误?如果一个未指定的COM失败,您能通过其他错误找出它是哪一个吗?可以在Visual Studio中复制此行为吗?每次都会发生。我不知道你所说的与此相关的另一个错误是什么意思。一切正常,但我遇到了这个错误。您添加了ActiveX控件吗。右键单击工具箱,然后选择项。然后单击COM选项卡,查看是否检查了任何内容,这将是最好的检查方式。您有什么问题吗
处理程序Me.FormClosing或Me.FormClosing上运行的任何代码您是否在代码中的任何位置调用了Marshal.FinalEleaseComObject或直接或间接引用的任何代码?谢谢。我用另一种方法解决了这个问题。。。不确定真正的原因是什么,但我删除了所有Microsoft.VisualBasic运行时方法,突然RCW错误消失了。否则我会像你建议的那样一个接一个地删除控件来跟踪错误。谢谢。我用另一种方法解决了这个问题。。。不确定真正的原因是什么,但我删除了所有Microsoft.VisualBasic运行时方法,突然RCW错误消失了。否则我会像你建议的那样逐个删除控件,跟踪错误。