Der Excel-Prozess wird nach dem Schließen in VB.net noch ausgeführt
Meine Frage ist im Grunde nur, wie man den Excel.exe-Prozess beendet, der bei der Verwendung von Excel ausgeführt wird. In der Anwendung öffne und verwende ich eine Excel-Arbeitsmappe mit einigen Arbeitsblättern und überlasse sie dann dem Benutzer, was er will. Mein Problem ist, dass meine Anwendung den Excel-Prozess niemals loslässt.
Wenn die Anwendung vor dem Schließen von Excel geschlossen wird, endet der Prozess mit dem Schließen von Excel. Wenn ich meine Anwendung nach dem Schließen von Excel schließe, läuft der Prozess weiter.
Ich habe ein paar Dinge ausprobiert, die ich im Internet gefunden habe, um mit GC.collect zu tun zu haben, und darauf gewartet, dass Finalizer oder ähnliches ausstehen, aber keines hat funktioniert.
Ich kann den Excel-Prozess auch problemlos abschließen. Das einzige Problem besteht darin, nicht zu wissen, ob ich eine wichtige Tabelle für Benutzer schließe, die sie noch nicht gespeichert haben, oder meine.
Ich bin nicht sicher, ob einer meiner Codes bei der Beantwortung hilfreich ist, verwende jedoch microsoft.office.interop.excel, um Excel zu erstellen, und verwende eine Arbeitsmappe, die bereits im Ressourcenordner der Anwendung gespeichert ist.
-Bearbeiten-
Hier ist alles, was ich versucht habe, ich weiß, es ist ein wenig übertrieben, aber leider endet der Prozess immer noch nicht
Marshal.ReleaseComObject(FirstWorksheet)
Marshal.FinalReleaseComObject(FirstWorksheet)
Marshal.ReleaseComObject(SecondWorksheet)
Marshal.FinalReleaseComObject(SecondWorksheet)
Marshal.ReleaseComObject(ThirdWorksheet)
Marshal.FinalReleaseComObject(ThirdWorksheet)
Marshal.ReleaseComObject(FourthWorkSheet)
Marshal.FinalReleaseComObject(FourthWorkSheet)
Marshal.ReleaseComObject(xlRange)
Marshal.FinalReleaseComObject(xlRange)
Marshal.ReleaseComObject(SecondxlRange)
Marshal.FinalReleaseComObject(SecondxlRange)
Marshal.ReleaseComObject(thirdxlRange)
Marshal.FinalReleaseComObject(thirdxlRange)
Marshal.ReleaseComObject(fourthxlRange)
Marshal.FinalReleaseComObject(fourthxlRange)
Marshal.ReleaseComObject(.activeworkbook)
Marshal.FinalReleaseComObject(.activeworkbook)
Marshal.ReleaseComObject(excelApplication)
Marshal.FinalReleaseComObject(excelApplication)
MSExcelControl.QuitExcel() 'A function made by someone else I work with that was meant to close excel's process
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
-Edit- Hier ist die quitExcel-Methode
Friend Shared Sub QuitExcel()
If Not getExcelProcessID = -1 Then
If Not excelApp Is Nothing Then
'Close and quit
With excelApp
Try
Do Until .Workbooks.Count = 0
'Close all open documents without saving
.Workbooks(1).Close(SaveChanges:=0)
Loop
Catch exExcel As Exception
'Do nothing
End Try
Try
.ActiveWorkbook.Close(SaveChanges:=0)
Catch ex As Exception
'Do nothing
End Try
Try
.Quit()
Catch ex As Exception
'Do nothing
Finally
myExcelProcessID = -1
End Try
End With
excelApp = Nothing
End If
End If
End Sub
Er hatte bereits versucht, dasselbe mit den Prozess-IDs in seiner Klasse zu tun. Das Problem war, dass seine ID nicht funktionierte. Deshalb habe ich versucht, die Prozess-ID selbst erneut zu ermitteln, was funktioniert hat