2010-02-14 50 views
33

我有一些COM组件,我从一些c#dll调用。已从其基础RCW中分离出的COM对象无法使用

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

当我关闭应用程序,我得到这个例外:已被分离 与其基础RCW不能使用

COM对象。

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

为什么会发生这种情况?如何解决它最好?

+5

阅读本:http://jake.ginnivan.net/vsto-com-interop – 2013-05-01 02:23:44

+0

[已从与其基础RCW分开不能使用COM对象(的可能的复制http://stackoverflow.com/questions/1567017/com-object-that-has-been-separated-from-underlying-rcw-无法使用) – bluish 2015-10-15 09:22:25

回答

30

这里描述的问题:

Is it safe to call an RCW from a finalizer?

这里:

Release Excel Object In My Destructor

麻烦的是,不仅是时机何时这些对象 是垃圾收集是不确定的,但是终止程序被调用的顺序也是不确定的信息研究所。在这种情况下,一个 运行时可调用包装器也有一个终结器,它调用 Marshal.FinalReleaseComObject自身,其结果为 递减围栏COM侧的引用计数,以便可以释放此对象的 。但是由于调用终结器的顺序并不确定,所以对象引用的COM对象的终结器很可能会在对象的终结器之前触发 。因此,您的 终结器中的代码有时可能会正常工作,但大多数情况下,您的对象引用将具有 的一个或多个 已调用终结器,并且基础COM对象 已在之前发布你的终结器可以执行它的代码。

+73

我没有遵循一件事! :x – nawfal 2012-02-22 08:35:39

+7

这很清楚:你实例化的对象周围的COM包装可能会在你自己清理它之前清理干净。翻译:如果Dispose()在基础x已经超出范围时尝试调用Marshal.ReleaseCOMObject(x),则Dispose()将失败。要检查范围/生命周期。感谢您的好链接,@Ran。 – JMD 2014-08-28 17:31:05

+0

感谢您的评论JMD,实际上为我解决了它 – Alex 2014-10-30 14:03:34

相关问题