Vb.net 终止Excel进程不工作w/GC(是的,另一个)

Vb.net 终止Excel进程不工作w/GC(是的,另一个),vb.net,garbage-collection,Vb.net,Garbage Collection,我已经阅读了我能找到的关于这个的每一篇文章,并且认为我正确地处理了它。但我有一个Excel COM进程,它仍然在运行。我知道它在哪里(请参阅caps中的注释),也知道它为什么会挂起(它使用Split(Range)调用,创建两个COM对象) 但我还是不知道如何杀死第二个物体。我认为等待GC的待定终结器可以处理这两个问题,但运气不好。我错过了什么 Private Sub PopulateSensorSizes(ByVal newContFlag As Boolean) Dim oExcel

我已经阅读了我能找到的关于这个的每一篇文章,并且认为我正确地处理了它。但我有一个Excel COM进程,它仍然在运行。我知道它在哪里(请参阅caps中的注释),也知道它为什么会挂起(它使用Split(Range)调用,创建两个COM对象)

但我还是不知道如何杀死第二个物体。我认为等待GC的待定终结器可以处理这两个问题,但运气不好。我错过了什么

Private Sub PopulateSensorSizes(ByVal newContFlag As Boolean)

    Dim oExcel As Excel.Application
    Dim oBook As Excel.Workbook
    Dim oSheet As Excel.Worksheet
    Dim Values() As String

    oExcel = New Excel.Application                          'Create a new instance of Excel
    oBook = oExcel.Workbooks.Open(ControllerParamFilePath)  'Get correct existing Controller file
    oSheet = oExcel.Worksheets(1)
    oExcel.Visible = False                                  'Don't show it to the user

    'Show sensor sizes
    Values = Split(oSheet.Range("B2").Value, "," & " ")     'Split text. TWO COM OBJECTS LAUNCHED HERE
    Dim i As Integer
    For i = 0 To UBound(Values)
        SelectSensorSize.Items.Add(Values(i))               'Add all integer sensor sizes to ListBox1
    Next i

    oBook.Close()                                           'Disconnect from Excel and end processes
    oExcel.Quit()
    oBook = Nothing
    oExcel = Nothing
    GC.Collect()
    GC.WaitForPendingFinalizers()

    SelectSensorSize.Items.Add("Enter new sensor size")

End Sub
编辑:我试图重写这个,试图消除“两点”问题,但我得到了相同的结果:一个进程仍在运行

Private Sub PopulateSensorSizes(ByVal newContFlag As Boolean)

    Dim oExcel As Excel.Application
    Dim oBook As Excel.Workbook
    Dim oSheet As Excel.Worksheet
    Dim Values() As String
    Dim ValRange as Excel.Range

    oExcel = New Excel.Application                          'Create a new instance of Excel
    oBook = oExcel.Workbooks.Open(ControllerParamFilePath)  'Get correct existing Controller file
    oSheet = oExcel.Worksheets(1)
    oExcel.Visible = False                                  'Don't show it to the user

    'Show sensor sizes
    ValRange = oSheet.Range("B2")
    Values = Split(ValRange.Value, "," & " ")     'Split text. TWO COM OBJECTS LAUNCHED HERE
    Dim i As Integer
    For i = 0 To UBound(Values)
        SelectSensorSize.Items.Add(Values(i))               'Add all integer sensor sizes to ListBox1
    Next i

    oBook.Close()                                           'Disconnect from Excel and end processes
    oExcel.Quit()
    oBook = Nothing
    oExcel = Nothing
    GC.Collect()
    GC.WaitForPendingFinalizers()

    SelectSensorSize.Items.Add("Enter new sensor size")

End Sub

拆分函数中有什么?您是否尝试过分离函数以查看它在何处创建两个对象?如果是对Range的调用,您可以尝试使用不同的函数,如.Cells(2,2).valuesplit函数是一个标准的MS函数:[link]我还尝试将GC调用重新定位到调用此方法的位置之后,如另一个线程中所建议的,结果还是一样:一个进程继续运行。我上面提到的线程是Hans Passant的:有趣的是,你解决了自己的问题。如何在不使用对现有excel工作簿/应用程序等的引用的情况下调用split函数。如果您能够在不创建另一个实例的情况下找到如何调用它,或者如果您能够找到该实例,您就能够清理它。split函数中有什么?您是否尝试过分离函数以查看它在何处创建两个对象?如果是对Range的调用,您可以尝试使用不同的函数,如.Cells(2,2).valuesplit函数是一个标准的MS函数:[link]我还尝试将GC调用重新定位到调用此方法的位置之后,如另一个线程中所建议的,结果还是一样:一个进程继续运行。我上面提到的线程是Hans Passant的:有趣的是,你解决了自己的问题。如何在不使用对现有excel工作簿/应用程序等的引用的情况下调用split函数。如果您能够在不创建另一个实例的情况下找到如何调用该函数,或者如果您能够找到该实例,则可以将其清理干净。