【发布时间】: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 的对象模型确实如此,并且您必须显式调用它才能让服务器卸载。