无法在.NET中发布Excel COM对象

时间:2009-09-18 16:55:58

标签: .net excel com dispose

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

作为WinForm的vIEW有一个Dispose()方法,它来自From类,它在Deisgner代码中被覆盖。

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

这就是我在我的presenter中插入我的dispose调用的地方,它本身是托管代码,但是包含非托管COM对象。

然后,演示者尝试通过执行以下操作来释放COM对象:

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

如果我在未导入任何内容的情况下打开应用程序,则关闭应用程序后Excel进程将消失。如果应用程序用于导入工作表,那么excel对象不会再放弃并保留在内存中,即使工作被执行或取消也是如此。

我找到了一个很好的链接,帮助我进一步,但问题仍然存在: How do I ensure that objects are disposed of properly in .NET?

感谢您的帮助,

2 个答案:

答案 0 :(得分:3)

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

要获得更深入的解释,请查看this reply到另一个问题,因为您可能正在清理其他Excel对象以确保不会保留引用。整个问题很有帮助,但特别是相关联的帖子应该总结一下。

答案 1 :(得分:-1)

在使用Excel COM对象之前,我遇到了同样的问题。您在应用程序中需要做的是在Dispose方法中,特别是检查Excel进程是否正在运行并手动终止它。

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