我创建了一个导入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?
感谢您的帮助,
答案 0 :(得分:3)
尝试使用FinalReleaseComObject而不是ReleaseComObject。请注意,FinalReleaseComObject不需要像ReleaseComObject那样在循环中使用。
要获得更深入的解释,请查看this reply到另一个问题,因为您可能正在清理其他Excel对象以确保不会保留引用。整个问题很有帮助,但特别是相关联的帖子应该总结一下。
答案 1 :(得分:-1)
在使用Excel COM对象之前,我遇到了同样的问题。您在应用程序中需要做的是在Dispose方法中,特别是检查Excel进程是否正在运行并手动终止它。
只需确保您所做的任何更改都已先保存。