我有一些COM组件,我从一些c#dll调用。
我还有一个使用该.dll的winforms应用程序。
当我关闭应用程序时,我得到了这个例外:
已分离的COM对象 从它的底层RCW不可能 使用
堆栈跟踪显示此异常来自.dll中的析构函数。我实现了这个析构函数来调用COM中的一些清理方法。
为什么会这样?如何最好地解决它?
答案 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对象将会被调用 已经在你的终结者执行其代码之前被释放。