繁体   English   中英

Excel Interop对象未被释放

[英]Excel Interop Objects not being released

我使用以下方法。 执行此代码块后,我发现Microsoft Excel仍然通过检查任务管理器在后台运行。

编辑 :正好一个 Microsoft Excel后台进程仍然有效。 我只是添加这个,因为当我第一次开始使用Excel和Interop COM对象时,有时很多进程会在函数执行完毕后继续运行。

执行当前函数后,如何确保Excel未在后台运行?


我用全局范围声明这些变量,因为几个函数最终需要它们:

private Excel.Application xls = null;
private Excel.Workbooks workBooks = null;
private Excel.Workbook workBook = null;
private Excel.Sheets sheets = null;
private Excel.Worksheet workSheet = null;

此方法用于检查给定工作簿中是否存在工作表:

private bool sheetExists(string searchString)
{
    xls = new Excel.Application();
    workBooks = xls.Workbooks;
    workBook = workBooks.Open(workbookPath); // <- Where the workbook is saved
    sheets = workBook.Sheets;

    bool isFound = false;

    foreach (Excel.Worksheet sheet in sheets)
    {
        // Check the name of the current sheet
        if (sheet.Name == searchString)
        {
            Marshal.ReleaseComObject(sheet);
            isFound = true;
            break;
        }

        Marshal.ReleaseComObject(sheet);
    }

    cleanUp(true, xls, workBooks, workBook, sheets);

    return isFound;
}

此函数用于释放COM对象:

private void cleanUp(bool saveTrueFalse, params object[] comObjects)
{
    workBook.Close(saveTrueFalse);

    xls.Application.Quit();
    xls.Quit();

    foreach (object o in comObjects)
    {
        Marshal.ReleaseComObject(o);
    }

    workSheet = null;
    sheets = null;
    workBook = null;
    workBooks = null;
    xls = null;

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

我希望看到一个合适的解决方案,但这个黑客是我能够让它工作的唯一方法。 似乎互操作库在告诉时关闭过程并不是很好。 如果在线程中运行,您将为每个线程启动进程。 我会通过按名称扫描进程并跟踪新进程来跟踪进程ID。 我在服务器上这样做,所以我知道所有进程都是互操作启动而不是由实际用户启动。 完成逻辑后,我会启动一个计时器,每隔一分钟就会尝试终止进程。 最终会把它关闭。 我还有一些代码可以在启动时杀死任何Excel进程,以防上次应用程序运行时没有正确杀死它们。

如果您想要按名称或ID杀死进程的示例代码,请告诉我们。 我没有随时可用,或者快速SO搜索应该带来一些好的样本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM