我有以下代码(从在线教程中获得)。该代码可以正常工作,但是我怀疑处理Excel com对象的方式有点而不是。我们真的需要调用GC.Collect吗?或处置此Excel com对象的最佳方法是什么?
Public Sub t1()
Dim oExcel As New Excel.Application
Dim oBook As Excel.Workbook = oExcel.Workbooks.Open(TextBox2.Text)
'select WorkSheet based on name
Dim oWS As Excel.Worksheet = CType(oBook.Sheets("Sheet1"), Excel.Worksheet)
Try
oExcel.Visible = False
'now showing the cell value
MessageBox.Show(oWS.Range(TextBox6.Text).Text)
oBook.Close()
oExcel.Quit()
releaseObject(oExcel)
releaseObject(oBook)
releaseObject(oWS)
Catch ex As Exception
MsgBox("Error: " & ex.ToString, MsgBoxStyle.Critical, "Error!")
End Try
End Sub
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
End Try
End Sub
最佳答案
@PanPizza C#和VB.NET非常相似,从行尾删除;
,Worksheets sheets = ...
变为Dim sheets Worksheets = ...
。如果您有兴趣提高编程水平,那么您应该真正学习如何在这两个.NET示例之间进行转换,因为它们仅在一个或另一个示例中提供,并且您实际上在限制自己。
如答案中所提到的:How do I properly clean up Excel interop objects?“从不使用两个点”,这意味着总是降级到单个子对象中,并且从不执行此操作Dim oWS AS Excel.Worksheet = oExcel.Worksheets.Open(...)
总是降级到工作簿,然后降级到工作表,永远不要直接从Excel.Application
进行。
通常,您需要做的是按照与创建项目相反的顺序释放项目。否则,您会从其他引用文献的底下移开脚步,而它们不会正确地释放。
请注意,如何创建Excel应用程序(oExcel
),然后是Excel Workbook(oBook
),然后是Excel Worksheet(oWS
),您需要以相反的顺序释放它们。
因此,您的代码变为:
oBook.Close()
oExcel.Quit()
releaseObject(oWS)
releaseObject(oBook)
releaseObject(oExcel)
Catch ex As Exception
并从
Sub releaseObject(ByVal obj As Object)
中完全删除此代码Finally
GC.Collect()
不需要,GC自然发生,并且不希望您的应用程序立即释放内存,.NET池分配了未分配的内存,以便它可以轻松地实例化此内存中的对象,而不必要求操作系统提供更多的内存。
关于.net - 使用VB.NET处理Excel com对象的正确方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10309365/