无法使用已与其基础RCW分离的COM对象

Yar*_*veh 46 c# com multithreading interop winforms

我有一些COM组件,我从一些c#dll调用.

我还有一个使用该.dll的winforms应用程序.

当我关闭应用程序时,我得到以下异常:

无法使用已与其基础RCW分离的COM对象.

堆栈跟踪显示此异常来自.dll中的析构函数.我实现了这个析构函数来调用COM中的一些清理方法.

为什么会这样?如何最好地解决它?

Ran*_*Ran 33

这个问题在这里描述:

从终结器调用RCW是否安全?

和这里:

在我的析构函数中释放Excel对象

麻烦的是,不仅是这些对象何时被垃圾收集不确定的时间,而且调用终结器的顺序也是不确定的.在这种情况下,运行时可调用包装器也有一个终结器,它自己调用Marshal.FinalReleaseComObject,其结果是减少围栅COM侧的引用计数,以便释放此COM对象.但由于调用终结器的顺序是不确定的,因此很有可能对象引用的COM对象的终结器将在对象的终结器之前触发.因此,终结器中的代码有时可以工作,但是,大多数情况下,对象引用的一个或多个Runtime Callable Wrappers已经调用了终结器,并且在终结器到达之前已经释放了底层COM对象执行其代码.

  • 我没跟上一件事!:X (77认同)
  • 很明显:在你自己清理它之前,可能会清理你实例化的对象周围的COM包装器.翻译:如果您的Dispose()尝试调用Marshal.ReleaseCOMObject(x),当底层x已经超出范围时,您的Dispose()将失败.要检查范围/生命周期.感谢@Ran的良好链接. (10认同)