我有一些COM组件,我从一些c#dll调用。已从其基础RCW中分离出的COM对象无法使用
我也有一个使用该.dll的winforms应用程序。
当我关闭应用程序,我得到这个例外:已被分离 与其基础RCW不能使用
COM对象。
堆栈跟踪显示此异常来自.dll中的析构函数。我实现了这个析构函数来调用COM中的一些清理方法。
为什么会发生这种情况?如何解决它最好?
我有一些COM组件,我从一些c#dll调用。已从其基础RCW中分离出的COM对象无法使用
我也有一个使用该.dll的winforms应用程序。
当我关闭应用程序,我得到这个例外:已被分离 与其基础RCW不能使用
COM对象。
堆栈跟踪显示此异常来自.dll中的析构函数。我实现了这个析构函数来调用COM中的一些清理方法。
为什么会发生这种情况?如何解决它最好?
这里描述的问题:
Is it safe to call an RCW from a finalizer?
这里:
Release Excel Object In My Destructor
麻烦的是,不仅是时机何时这些对象 是垃圾收集是不确定的,但是终止程序被调用的顺序也是不确定的信息研究所。在这种情况下,一个 运行时可调用包装器也有一个终结器,它调用 Marshal.FinalReleaseComObject自身,其结果为 递减围栏COM侧的引用计数,以便可以释放此对象的 。但是由于调用终结器的顺序并不确定,所以对象引用的COM对象的终结器很可能会在对象的终结器之前触发 。因此,您的 终结器中的代码有时可能会正常工作,但大多数情况下,您的对象引用将具有 的一个或多个 已调用终结器,并且基础COM对象 已在之前发布你的终结器可以执行它的代码。
阅读本:http://jake.ginnivan.net/vsto-com-interop – 2013-05-01 02:23:44
[已从与其基础RCW分开不能使用COM对象(的可能的复制http://stackoverflow.com/questions/1567017/com-object-that-has-been-separated-from-underlying-rcw-无法使用) – bluish 2015-10-15 09:22:25