释放Com对象

本文关键字:对象 Com 释放 | 更新日期: 2023-09-27 18:01:21

我遇到了EXCEL应用程序在任务管理器中保持打开的问题,即使在我通过代码清理(或认为我正在清理)之后。谁能指出我从下面的代码片段中遗漏了什么:

private void btnBrowseSquid_Click(object sender, EventArgs e)
        //starting up and defining the Excel references
        Excel.Workbook squidBook = null;
        Excel.Application excelApp = null;
        Excel.Worksheet squidSheet = null;
        string squidFileName = txtSquid.Text;
        //Reading the information from the "Filenames" tab of the SQUID file into the Windows Form
        excelApp = new Excel.Application();
        excelApp.Visible = true;
        squidBook = excelApp.Workbooks.Open(squidFileName);
        squidSheet = squidBook.Sheets["Filenames"];
        //do stuff here with the excel file
        //close the open Excel App
        squidBook.Close();
        excelApp.Quit();
        Marshal.FinalReleaseComObject(squidSheet);
        Marshal.FinalReleaseComObject(squidBook);
    }

释放Com对象

还做以下操作:

Worksheets sheets = excelApp.Worksheets; 
Marshal.ReleaseComObject(squidSheet);
Marshal.ReleaseComObject(squidBook );
Marshal.ReleaseComObject(sheets);
squidSheet = null;
squidBook = null;
sheets = null;
GC.Collect();
GC.WaitForPendingFinalizers();

你必须释放表,因为你持有一个引用,通过执行以下语句:

squidSheet = squidBook.Sheets["Filenames"];

您可能有一个失败的过程,您的代码没有到达终点....

尝试在运行代码之前完成该操作。(确保你没有打开其他excel应用程序)。

当你确信你的代码永远不会失败时,运行它,看到应用程序从进程列表中消失。

使用Office Interop可能会很棘手,因为在清理代码中有很多错误。你是否尝试过将代码减少到最低限度并向外扩展,直到问题重现(例如创建应用程序,退出应用程序;Excel.exe挂出来了吗?创建app,加载工作簿,关闭工作簿,退出app;Excel.exe挂出来了吗?…)?

说了这么多,上次我遇到这个问题(Outlook)的根本原因是因为默认的互操作层没有正确地释放事件钩子——所以我不得不显式地这样做。准备好一些挫折,但通过一些实验,您应该能够运行它。

我能够遵循@Philip的建议并取消ExcelApp,然后像下面这样释放COM对象,它工作了。谢谢你的帮助。

 //close the open Excel App
        squidBook.Close();
        excelApp.Quit();
        Marshal.FinalReleaseComObject(squidSheet);
        Marshal.FinalReleaseComObject(squidBook);
        Marshal.FinalReleaseComObject(excelApp);
        excelApp = null;
        squidSheet = null;
        squidBook = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();