2011-02-18 75 views
0

我有以下代碼,其中有一些類級別的Excel對象定義的類。 當我從另一個類 調用excelModule.Test時,所有這些Excel對象都已創建,並且我可以在任務管理器中看到一個Excel實例。如何發佈Excel應用程序對象

我們是否有類卸載事件來釋放這些對象?

Module excelModule 
    Public myRange As Excel.Range 
    Public mySheet As Excel.Worksheet 
    Public wb As Excel.Workbook 
    Public ex As New Excel.Application 

    Public Sub Test() 

    End Sub 
End Module 
+1

你問的如何釋放COM對象?我認爲COM對象的.NET包裝器實現了`IDisposable`,你應該可以在完成使用對象時調用Dispose。 – 2011-02-18 04:30:12

+1

@Ben,沒有運行時可調用包裝器(RCW's)不實現IDisposable。他們有終結者,但他們不能被處置。 – Josh 2011-02-18 04:41:44

回答

4

在呼籲退出可能工作,它也有缺陷,因爲如果用戶有Excel中打開您的應用程序創建之前,羅伯特的建議Application對象,然後調用Quit將退出其打開的Excel實例。

問題是,COM應用程序不知道您已完成對Excel應用程序對象的引用。即使它超出範圍並且有資格進行垃圾收集/定稿,定稿也不會立即生效。

在極少數情況下,有必要在COM對象上調用Marshal.FinalReleaseComObject,但大多數情況下這不是必需的。

因此,雖然顯式觸發垃圾回收幾乎總是被忽視,但事實是,它有時在.NET/COM互操作中是必需的。試試這個(確保你不再持有任何對Excel對象的引用...)

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

由於您使用的是非託管資源,因此應將模塊更改爲類,並讓該類實現IDisposable接口。在Dispose方法中,確保正確處理Excel對象。

然後,當您使用Excel的包裝類,在Using塊這樣做:

Using e as New ExcelWrapper() 
    e.Test() 
End Using