與Office(通常是Excel)一起使用COM Interop時,我總是小心地確保在每次引用時都撥打Marshal.ReleaseComObject
,以避免Excel無法退出的問題as described in this KB article。如何在Silverlight 4中釋放COM對象
如何在使用OOB Silverlight應用程序中的Interop時(AutomationFactory.CreateObject
)確保Excel退出?
Silverlight沒有Marshal.ReleaseComObject
方法,甚至撥打GC.Collect
和GC.WaitForPendingFinalizers
也沒有幫助。
當然,Microsoft沒有將此功能添加到Silverlight,而沒有一種機制來釋放COM引用?這對我來說似乎是自動化進程外COM服務器(如Excel)的不二之選。
一個令人驚訝的ommission,更何況作爲皮特·布朗在他的著作「在行動的Silverlight 4」第5.5節竟把要說AutomationFactory.CreateObject
,即:
此功能的主要目的是允許自動化其他應用程序,包括Microsoft Office。
UPDATE迴應漢斯的意見。
我不相信在典型的Office應用程序自動化中存在「無聲刺客」問題。一個常見的用途可能類似於下面,我已經看到了的WinForms應用程序重複使用,而不需要通過不斷來「毒害RCW」的文章由漢斯鏈接中描述:
- 創建Excel.Application實例
- 打開或創建一個工作簿
- 將數據寫入到工作簿
- 顯示Excel中,如果一切順利的話,關閉工作簿,如果沒有調用Application.Quit。
- 調用Marshal.ReleaseComObject釋放所有Excel對象引用。
如Hans所推薦,未能調用Marshal.ReleaseComObject會導致運行Excel.exe的多個副本,如上面提到的知識庫文章中所述 - 這是非常不理想的。
更新2
我使用瑞普這是由皮特·布朗的書的Silverlight 4在行動的源代碼樣本的樣本,有此頁面上的下載鏈接。示例解決方案AutomatingExcel位於Ch05.zip/5.03中。要瑞普:
- 確保沒有Excel的實例在運行
- 運行AutomatingExcel樣品
- Excel工作簿打開
- 關閉Excel
- 使用任務管理器觀察到的Excel仍在運行。
將所有的動態變量設置爲null並調用GC.Collect()似乎像在AnthonyWJones的答案中指出的那樣工作。
更新2
宅男的答案是什麼,我一直在尋找 - 通過在using語句的COM引用,而無需調用GC.Collect釋放包裹引用。一些實驗表明,與上面引用的知識庫文章中描述的標準Marshal.ReleaseComObject
解決方案不同,它更容易處理每個單獨的引用。
確切地說必須處理什麼以確保所有Excel引用都已發佈,這將是一件有趣的事情。
的可能重複的[?何時使用RelaseComObject VS FinalReleaseComObject](http://stackoverflow.com/ question/3937181/when-to-use-relasecomobject-vs-finalreleasecomobject) – 2011-04-09 13:28:36
@Hans:Silverlight在Marshal類中沒有這些方法。 – AnthonyWJones 2011-04-09 13:57:35
@Anthony - 它解釋了爲什麼這些方法都不是一個好主意。 「無聲刺客」鏈接非常相關。 – 2011-04-09 14:01:10