簡體   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