[英]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.