不能在.NET中释放Excel COM对象

我创build了一个导入Excel工作表的工具。 Excel的COM对象是在应用程序的生命周期中创build的。 我已经将MVP模式应用于我的工具,以便VIEW和Presenter分离UI和逻辑。

WinForm的vIEW具有一个Dispose()方法,由From类inheritance,在Deisgner代码中被覆盖。

protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); _presenter.Dispose(); } 

多数民众赞成在我插入我的处置调用我的主持人,其本身是托pipe代码,但却包含非托pipe的COM对象。

演示者然后试图通过这样释放COM对象:

 public void Dispose() { Int32 countDown = 1; while (countDown > 0) countDown = Marshal.ReleaseComObject(_excelObj); } 

如果我打开应用程序而不导入任何东西,Excel过程在closures应用程序后消失。 如果应用程序用于导入工作表,excel对象不会再放弃并保留在内存中,甚至在作业被完全执行或取消之后。

我find了一个很好的链接,帮助我进一步,但问题仍然存在: 如何确保对象在.NET中正确处理?

感谢帮助,

尝试使用FinalReleaseComObject而不是ReleaseComObject。 请注意,FinalReleaseComObject不需要像ReleaseComObject一样在循环中使用。

为了更深入的解释,看看这个答复的另一个问题,因为有可能其他的Excel对象,你可以清理,以确保参考不被持有。 整个问题是有帮助的,但链接的post应该总结一下。

使用Excel COM对象之前,我遇到过相同的问题。 在您的应用程序中,您必须在Dispose方法中执行此操作,具体检查是否正在运行Excel进程并手动将其终止。

只要确保您所做的任何更改都已先保存。