我有一个非常大的项目,我不能轻易删除。
当应用程序关闭时,我收到错误
"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来分析反汇编。
答案 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 ,这将释放对变量的引用,您可以随时检查它的可用性代码中的任何地方。