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

时间:2010-02-14 12:11:09

标签: c# winforms com interop multithreading

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

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

当我关闭应用程序时,我得到了这个例外:

  

已分离的COM对象   从它的底层RCW不可能   使用

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

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

1 个答案:

答案 0 :(得分:33)

这里描述了这个问题:

Is it safe to call an RCW from a finalizer?

在这里:

Release Excel Object In My Destructor

  

麻烦的是,这些物体的时间不仅仅是时间   被垃圾收集不确定,但顺序在哪里   调用终结者也是不确定的。在这种情况下,一个   Runtime Callable Wrapper还有一个终结器,可以调用   Marshal.FinalReleaseComObject本身,其结果是   减少围栏COM侧的引用计数   这个COM对象可以被释放。但自从其中的顺序   终结者被称为不确定,很有可能   您的对象引用将触发的COM对象的终结器   在你的对象的终结者之前。所以你的代码   终结者有时可以工作,但是,大部分时间,一个或多个   您的对象引用的Runtime Callable Wrappers将具有   已经调用了终结器,底层的COM对象将会被调用   已经在你的终结者执行其代码之前被释放。