none
VB.Net Excel Prozess wird nicht beendet RRS feed

  • Frage

  • Hallo,

    ich habe in einem SSIS Paket ein VB.net Script, das Daten aus einer Excel Tabelle ausliest. Aus irgendeinem Grund bekomme ich den Excel Prozess nicht beendet.
    Hat jemand eine Idee, wo das Problem liegen könnte?
    Her der relevante Bereich aus dem Code:

    DIM xl as Object = CreateObject("Excel.Application",)
    :
    :
    :
       xl.Workbooks.Open(xlFileName) 'Dateiname mit Pfad
    :
    :
    :
       xl.Workbooks(xlFileName).Close(False) 'Dateiname ohne Pfad
       GC.WaitForPendingFinalizers()
       xl.Quit()
       GC.WaitForPendingFinalizers()
       xl = Nothing

    Wie gesagt, der Excel Prozess ist anschließend weiterhin vorhanden.
    Hat jemand eine Idee, wo das Problem liegt?

    Gruß

    cheapy

    Donnerstag, 30. März 2017 11:58

Antworten

  • Ich weiß zwar nicht ob diese Lösung als so richtig sauber einzustufen ist aber zumindest ist das Problem mit dem nicht gechlossenen Prozess damit gelöst.

    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Integer, ByRef lpdwProcessId As IntPtr) As IntPtr
    
    'Beenden eines speziellen Excel Prozesses, anhand seiner Id
    Private Shared Sub killExcelInstanceById(ByRef xlsApp As Object)
    Dim processId As IntPtr
    
       GetWindowThreadProcessId(xlsApp.Hwnd, processId)
    
       Dim excelProcess As Process = Process.GetProcessById(processId.ToInt32())
    
       excelProcess.Kill()
    End Sub

    • Als Antwort markiert Cheaptrick_la Donnerstag, 30. März 2017 13:09
    Donnerstag, 30. März 2017 13:09

Alle Antworten

  • Ich weiß zwar nicht ob diese Lösung als so richtig sauber einzustufen ist aber zumindest ist das Problem mit dem nicht gechlossenen Prozess damit gelöst.

    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Integer, ByRef lpdwProcessId As IntPtr) As IntPtr
    
    'Beenden eines speziellen Excel Prozesses, anhand seiner Id
    Private Shared Sub killExcelInstanceById(ByRef xlsApp As Object)
    Dim processId As IntPtr
    
       GetWindowThreadProcessId(xlsApp.Hwnd, processId)
    
       Dim excelProcess As Process = Process.GetProcessById(processId.ToInt32())
    
       excelProcess.Kill()
    End Sub

    • Als Antwort markiert Cheaptrick_la Donnerstag, 30. März 2017 13:09
    Donnerstag, 30. März 2017 13:09
  • Hallo cheapy,

    auch wenn du im obigen Code anscheinend versuchst, jeder Referenz-Variablen aus dem Weg zu gehen, so werden sie bei COM zwangsläufig erzeugt. Der Garbage Collector ist i. a. gut darin, diese Verweise nach zu verfolgen (dazu braucht er keine Verweise im Code).

    Bei dir scheint das aber nicht ganz zu klappen. Dies mag in dem nicht gezeigten ":" Abschnitte(n) passieren. Siehe dazu: Proper way of releasing COM objects? und How do I properly clean up Excel interop objects?.

    Wobei das dort mehrmalig gezeigte übertreiben mit ReleaseComObject ebensowenig notwendig ist, siehe Einleitung.>

    Gruß Elmar

    Donnerstag, 30. März 2017 13:12
    Beantworter
  • Hallo,

    sauber ist das keinesfalls. Vor allem riskierst du eine kaputte Excel-Datei.

    Gruß Elmar

    Donnerstag, 30. März 2017 15:05
    Beantworter