互操作后Excel流程仍然开放; 传统方法不起作用

bra*_*enb 8 .net c# com excel-interop

我遇到了一些我正在调试的代码问题.Excel interop用于从工作簿中提取某些值; 但是,Excel程序退出后仍保持打开状态.我已经尝试了传统的解决方案,但它仍然在运行代码的所有机器上保持对Excel的引用

private void TestExcel()
    {
        Excel.Application excel = new Excel.Application();
        Excel.Workbooks books = excel.Workbooks;
        Excel.Workbook book = books.Open("C:\\test.xlsm");

        book.Close();
        books.Close();
        excel.Quit();

        Marshal.ReleaseComObject(book);
        Marshal.ReleaseComObject(books);
        Marshal.ReleaseComObject(excel);
    }
Run Code Online (Sandbox Code Playgroud)

即使是这段简单的代码也可以使进程运行多个文件(xlsm,xlsx,xls).现在我们有一个解决方法来杀死我们已经打开的Excel进程,但我更倾向于让这个工作为我自己的理智.

我应该补充一点,我已将其缩小到Workbook变量.如果我删除了对books.Open()所有引用的调用,book那么它将成功关闭.

Adi*_*l B 13

这对我来说很成功:

        xlApp.Quit();

        //release all memory - stop EXCEL.exe from hanging around.
        if (xlWorkBook != null) { Marshal.ReleaseComObject(xlWorkBook); } //release each workbook like this
        if (xlWorkSheet != null) { Marshal.ReleaseComObject(xlWorkSheet); } //release each worksheet like this
        if (xlApp != null) { Marshal.ReleaseComObject(xlApp); } //release the Excel application
        xlWorkBook = null; //set each memory reference to null.
        xlWorkSheet = null;
        xlApp = null;
        GC.Collect();
Run Code Online (Sandbox Code Playgroud)

  • 标记为答案,因为这是正确的.虽然它仍然无法在我的开发机器上运行,但这适用于干净安装或家用计算机.奇. (2认同)

lan*_*ues 5

这段代码对我有用。

//Declare separate object variables
Excel.Application xlApp = new Excel.Application();
Excel.Workbooks xlWorkbooks = xlApp.Workbooks;
Excel.Workbook xlWorkbook = xlWorkbooks.Add(Missing.Value);
Excel.Worksheet xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1);

//Create worksheet

xlWorkbook.Close(false, Missing.Value, Missing.Value);
xlWorkbooks.Close();
xlApp.Quit();

Marshal.FinalReleaseComObject(xlWorksheet);
Marshal.FinalReleaseComObject(xlWorkbook);
Marshal.FinalReleaseComObject(xlWorkbooks);
Marshal.FinalReleaseComObject(xlApp);

xlWorksheet = null;
xlWorkbook = null;
xlWorkbooks = null;
xlApp = null;

GC.Collect();
Run Code Online (Sandbox Code Playgroud)

Microsoft 的这篇文章提供了有关此问题的一些很好的信息。