Najlepszy sposób na uwolnienie obiektu Interop Excel
Eksperci, daj mi znać, jak najlepiej mogę to zrobić ...
Pracuję nad aplikacją VB.Net, która używa biblioteki obiektów Microsoft.Office.Interop.Excel do tworzenia arkuszy w skoroszycie i tabelach przestawnych w tych arkuszach.
Mój kod wygląda mniej więcej tak:
Dim ExcelApp As New Microsoft.Office.Interop.Excel.Application
Dim wbk As Microsoft.Office.Interop.Excel.Workbook = Nothing
Dim wksRawData As Microsoft.Office.Interop.Excel.Worksheet = Nothing
Dim wksPvtTbl As Microsoft.Office.Interop.Excel.Worksheet = Nothing
Dim pvtCache As Microsoft.Office.Interop.Excel.PivotCache = Nothing
Dim pvtTables As Microsoft.Office.Interop.Excel.PivotTables = Nothing
Dim pvtTable As Microsoft.Office.Interop.Excel.PivotTable = Nothing
Dim r1 As Microsoft.Office.Interop.Excel.PivotField = Nothing
Dim r2 As Microsoft.Office.Interop.Excel.PivotField = Nothing
Dim df1 As Microsoft.Office.Interop.Excel.PivotField = Nothing
Try
... Create the objects, put in the information
Catch ex As Exception
MessageBox.Show("There was an error creating the Excel file", "Error Creating File", MessageBoxButtons.OK)
Finally
ReleaseObject(r1)
ReleaseObject(r2)
ReleaseObject(df1)
ReleaseObject(pvtTable)
ReleaseObject(pvtTables)
ReleaseObject(pvtCache)
ReleaseObject(wksRawData)
ReleaseObject(wksPvtTbl)
ReleaseObject(wbk)
ExcelApp.DisplayAlerts = True
ExcelApp.Quit()
ReleaseObject(ExcelApp)
ExcelApp = Nothing
wbk = Nothing
wksRawData = Nothing
GC.Collect()
End Try
Następnie mam kod, który wygląda następująco dla moich obiektów wydania:
Public Sub ReleaseObject(ByRef Reference As Microsoft.Office.Interop.Excel.Application)
Dim i As Integer
If Reference IsNot Nothing Then
i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)
While i > 0
i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)
End While
Reference = Nothing
End If
End Sub
Public Sub ReleaseObject(ByRef Reference As Microsoft.Office.Interop.Excel.Workbook)
Dim i As Integer
If Reference IsNot Nothing Then
i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)
While i > 0
i = System.Runtime.InteropServices.Marshal.ReleaseComObject(Reference)
End While
Reference = Nothing
End If
End Sub
... etc
Wiem, że istnieje WIELE rozwiązań dla tego rodzaju problemów, ale gubię się w tych wszystkich, aby wiedzieć, co najlepiej pasuje do mojej obecnej sytuacji ... Czy to dobry sposób, aby to zrobić, a jeśli nie, to co to jest bardziej wydajny sposób?
Dzięki!!!