【问题标题】:How to dispose of Excel.Application class correctly [duplicate]如何正确处理 Excel.Application 类 [重复]
【发布时间】:2023-03-23 17:35:01
【问题描述】:

我对一个问题感到非常痛苦,而Excel.Application() 无论如何都不想被释放。即使在一个新类被实例化并立即释放后,它仍然会出现在进程列表中。

if (_ExcelApp == null)
    _ExcelApp = new Microsoft.Office.Interop.Excel.Application();
Dispose();

public void Dispose()
{
    if (_ExcelApp != null)
    {
        try
        {
            _ExcelApp.Quit();
            Marshal.FinalReleaseComObject(_ExcelApp);
        }
        catch (Exception) { }
            _ExcelApp = null;
    }
}

请帮忙!

【问题讨论】:

  • 查看question
  • 最好的处理方法是使用 using() 语句,一旦对象完成,它会自动处理它们
  • 好的,所以我已经设法设置_ExcelApp 并立即处理它。但是,如果我执行_ExcelApp.Workbooks.Add()(注意没有参数)然后尝试公开_ExcelApp,它会继续保留应用程序。

标签: c# com com-interop excel-interop


【解决方案1】:

它不会释放,因为并非所有与_ExcelApp 相关的COM 对象都已释放。如果您提供所有代码,它可能会更清晰。

Workbooks wb =_ExcelApp.Workbooks;
Workbook book = wb.Add();

然后在try catch中:

          try
            {
              book.Close();
              Marshal.ReleaseComObject(book);
              wb.Close();
              Marshal.ReleaseComObject(wb);
              _ExcelApp.Quit();
              Marshal.FinalReleaseComObject(_ExcelApp);
            }
        catch (Exception) { }
            _ExcelApp = null;
    }

_ExcelApp.WorkBooks.Add();创建新的 WorkBook 并且您不释放此对象。它还创建了也必须释放的 Workbooks 对象。

正如我之前提到的,如果你显示所有代码会更好(当然如果可能的话)

【讨论】:

  • 所以我最终在每个 COM 对象被使用后释放它们并将它们设置为空。事实证明这很麻烦,因为我有多个列和单元格、工作表、工作簿等。
  • 我可以补充一点,我最初没有将对象设置为 null,所以这可能是我的缺陷。大魔王
猜你喜欢
  • 2019-04-12
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多