我有以下代码(从在线教程中获得)。该代码可以正常工作,但是我怀疑处理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/

10-11 22:30
查看更多