2014-11-04 18 views
0

我嘗試創建一個類,在那裏我想要使用excel實例,並且我希望退出該excel實例(如this answer所述。仍然可以debug it properly我分開垃圾總彙方式如下:。退出excel實例作爲類成員點播

Imports Excel = Microsoft.Office.Interop.Excel 

Public Class Form1 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim xlsInst As New ExcelInst 
     GC.Collect() 
     GC.WaitForPendingFinalizers() 
    End Sub End Class 

Public Class ExcelInst 
    Sub New() 
     Dim myxlApp As New Excel.Application 
     Dim myxlWb As Excel.Workbook 
     '~~> Add a new Workbook 
     myxlWb = myxlApp.Workbooks.Add 
     '~~> Display Excel 
     myxlApp.Visible = True 
     myxlApp.Quit() 
    End Sub End Class 

觀察任務管理器的Excel實例儘快形式加載正確退出,但我不滿意類原因我想有myxlApp私有變量和myxlWB。但是,如果我將我的課程更改爲

Public Class ExcelInst 
    Private myxlApp As New Excel.Application 
    Private myxlWb As Excel.Workbook 

    Sub New() 
     '~~> Add a new Workbook 
     myxlWb = myxlApp.Workbooks.Add 
     '~~> Display Excel 
     myxlApp.Visible = True 
     myxlApp.Quit() 
    End Sub 
End Class 

excel不再按需求關閉。任何人都知道爲什麼第一個片段的工作原理(根據我的要求,第二個不是嗎?)

+0

你必須調用ReleaseCom對象http://stackoverflow.com/questions/15697282/excel-application-not-quitting-after-calling-quit在對象的構造函數中打開和關閉excel看起來很奇怪。此外,在您的加載中,xlsInst對象在調用垃圾回收時仍然存在。 – 2014-11-04 17:48:33

+0

ReleaseComObject是excactely我試圖避免,因爲它不被推薦(請參閱我的鏈接)。我不想尋找解決辦法,我只想知道爲什麼第一個工作,第二個不是。我將在我的文章中澄清。 – ruedi 2014-11-04 18:41:29

+1

我會假設,因爲您在GC.Collect之前仍然有對xlsInst的引用,並且該對象包含對excel的引用,GC將不會收集。嘗試在收集之前做xlsInst = Nothing,並且也可以將該類中的變量設置爲無。 – 2014-11-04 19:14:12

回答

2

我會假設既然您在GC.Collect之前仍然有對xlsInst的引用,並且該對象包含對excel的引用,則GC不會收集。嘗試之前收集做xlsInst =什麼,也許在類中設置的參數爲空也。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim xlsInst As New ExcelInst 
    xlsInst = Nothing 
    GC.Collect() 
    GC.WaitForPendingFinalizers() 
End Sub End Class 

Public Class ExcelInst 
    Private myxlApp As New Excel.Application 
    Private myxlWb As Excel.Workbook 

    Sub New() 
     '~~> Add a new Workbook 
     myxlWb = myxlApp.Workbooks.Add 
     '~~> Display Excel 
     myxlApp.Visible = True 
     myxlApp.Quit() 

     myxlApp = Nothing 
     myxlWb = Nothing 
    End Sub 
End Class 

我要補充,我覺得很奇怪,有一個新的內部的邏輯( )。我建議把它放在一個靜態函數中,或者有一個.ProcessExcel()或.CloseExcel()函數。