【问题标题】:Can't release Excel COM object in .NET无法在 .NET 中释放 Excel COM 对象
【发布时间】:2010-11-29 13:32:50
【问题描述】:

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

作为 WinForm 的 vIEW 具有从 From 类继承的 Dispose() 方法,该方法在 Deisgner 代码中被覆盖。

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

这就是我在演示者中插入 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?

感谢您的帮助,

【问题讨论】:

  • 我不知道足够的细节来发布答案,但是 Excel 对象模型在某处没有 Quit 方法吗?我似乎记得 Word 的对象模型确实如此,并且您必须显式调用它才能让服务器卸载。

标签: .net excel com dispose


【解决方案1】:

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

如需更深入的解释,请查看this reply 的另一个问题,因为您可能需要清理其他 Excel 对象以确保不保留引用。整个问题很有帮助,但链接的帖子尤其应该总结一下。

【讨论】:

  • 啊,这正是我想要的!谢谢!
【解决方案2】:

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

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

【讨论】:

  • 这里的危险是,如果另一个与我无关的 Excel 表已经打开了怎么办?然后我会错误地杀死错误的进程并丢失数据。
猜你喜欢
  • 2015-07-09
  • 2015-09-25
  • 2012-09-17
  • 2012-03-05
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多