2009-09-03 68 views
5

這是一個關於 How to properly clean up excel interop objects in c#的問題。如何正確清理C中的互操作對象#

該gyst是在Excel命名空間內使用鏈接調用(例如,ExcelObject.Foo.Bar())可以防止COM對象的垃圾回收。相反,應該明確地創建對每個使用的COM對象的引用,並使用Marhsal.ReleaseComObject()明確地釋放它們。

僅在特定於Excel COM對象的鏈接調用後才釋放COM對象的行爲?無論何時使用COM對象,應用這種模式是否矯枉過正?

回答

6

由於兩個原因,處理Office應用程序時處理髮行版肯定比許多其他COM庫更重要。

  1. Office應用程序作爲進程外服務器運行,而不是進程內庫。如果你沒有正確清理,你會讓一個進程運行。
  2. 即使調用Application.Quit,如果有未完成的COM對象引用,Office應用程序(尤其是Excel IIRC)也不會正確終止。

對於普通的進程內COM庫來說,沒有正確清理的後果並不那麼顯着。當你的進程退出時,所有進程內庫都會消失。如果您不再需要它時忘記在某個對象上調用ReleaseComObject,那麼在對象最終完成時它仍然會被照顧。

這就是說,這是沒有理由寫潦草的代碼。

+0

非常好的點RE:爲什麼你必須清理辦公室互操作對象 – 2010-09-30 05:58:59

2

COM對象本質上是非託管代碼 - 只要您開始從託管應用程序調用非託管代碼,它就成爲您在非託管代碼之後清理的責任。

總之,在上述交聯的圖案是必需的所有 COM對象。

+0

...對於「必要」的某些定義。在進程關閉(或應用程序域卸載,如果這種情況首先發生),我相信所有尚未銷燬的RCW(運行時可調用包裝)將被釋放。不幸的是,他們周圍並沒有強有力的保證,正確地被破壞,並且所有的終結者都被執行了。除此之外,如果銷燬COM對象的時間超過2秒,CLR將終止在該線程上執行的整個終結器隊列。 – reuben 2009-09-03 09:24:35

+2

@Reuben,請閱讀這個問題,關於被問的問題,答案是100%正確的,然而關於COM的重要內在細節與這個問題無關。 – 2009-09-03 11:18:52