簡體   English   中英

掛起互操作COM對象的問題

[英]Problem with hanging interop COM objects

我有一個應用程序使用COM互操作來創建一個電子表格,該電子表格在客戶端的機器上的Excel中打開。 但是,如果我查看任務管理器,則當用戶關閉Excel時,似乎並不總是結束EXCEL.exe進程。

如果我正在保存工作簿並以編程方式關閉Excel,我只會使用Marshal.ReleaseComObject()來清理,但由於我依賴於手動關閉程序,我不知道該怎么做。 有什么建議?

在釋放所有進程外對象之前,Excel無法終止。 所以它只是隱藏了它的用戶界面並繼續運行。 直到您的程序退出或者您的所有Excel對象引用為空並且終結器線程運行。 退出程序將是一個明顯的解決方案。 或者您可以強制終結器線程運行:

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

ReleaseComObject()很少有效,因為它很容易忘記中間COM對象引用。 像WorkBooks [index]一樣,這是一個你看不到的枚舉器。 讓GC做出自己的決定將是更明智的選擇,如果你繼續跑步和做工作那么就會發生。

可能Excel.exe仍處於打開狀態,因為用戶在Excell應用程序的同一實例中打開了另一個文檔。 在這種情況下,您可能不應該殺死Excel.exe進程。

如果確保關閉所有打開的文檔,並釋放所有創建的對象,那么為什么確保Excel.exe終止是很重要的? 也許這個過程正在為另一個應用程序或用戶提供服務?

如果我打開Excel應用程序和工作簿:

Excel.Application app = new Excel.Application();
Excel.Workbook wb = app.Workbooks.Open(...);

然后我在finally語句(或其他適當的結束事件)中使用wb.Close()app.Quit()方法。 這將清除Exel.exe進程。 無需調用Marshall.ReleaseComObject或GC方法。

可能有很多原因(包括Ran的),但我看到很多MapPoint(另一個帶有COM接口的Microsoft應用程序)是你必須確保清除所有對象引用,以便垃圾收集器可以清理它們。 懸掛的一個低位對象足以阻止應用程序關閉並退出進程列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM