Excel -mehr noch alle Com-Objekte überhaupt, wie sie bei Excel-InterOp. Word, Winexplorer, (viele weitere...) entstehen, haben eine äusserst unschöne Eigenschaft: Sie werden nicht von selbst freigegeben.
Bei Excel führt das zum Beispiel dazu, dass die Excel-Anwendung, nachdem man sie mit
MSDN erklärt auf englisch die Lösung, und schließt lapidar: "This behavior is by design"
HIer nochmal auf deutsch (Beispiel Excel):
Die Lösung liegt also darin, jedes einzelne Excel-Interop-Objekt mit Marshal.FinalRelease wieder freizugeben. Das verkompliziert excel-interop-Programmierung erheblich, ist aber nicht unmöglich.
Also sowas führt zum Fehlverhalten:In dieser popeligen Zeile entstehen neben dem vorrausgesetzten Excel.Application - Objekt noch 6 weitere Excel-Objekte, die alle einzeln freizugeben sind:
beachte: das xcelApp - Objekt wurde hier noch nicht released, wg Annahme, dasses noch weiter verwendet werden soll.
Es gibt noch 2 weitere Lösungen
Credits an:
Bei Excel führt das zum Beispiel dazu, dass die Excel-Anwendung, nachdem man sie mit
xcelApp.Quitt()
geschlossen hat, noch immer unsichtbar im Speicher verbleibt. Das merkt man erst, wenn man Excel anschließend normal öffnen will - das geht dann nämlich nicht.MSDN erklärt auf englisch die Lösung, und schließt lapidar: "This behavior is by design"
HIer nochmal auf deutsch (Beispiel Excel):
Die Lösung liegt also darin, jedes einzelne Excel-Interop-Objekt mit Marshal.FinalRelease wieder freizugeben. Das verkompliziert excel-interop-Programmierung erheblich, ist aber nicht unmöglich.
Also sowas führt zum Fehlverhalten:In dieser popeligen Zeile entstehen neben dem vorrausgesetzten Excel.Application - Objekt noch 6 weitere Excel-Objekte, die alle einzeln freizugeben sind:
- das Workbooks-Objekt - eine Auflistung der Workbooks wird angesprochen
- das Workbook, welches per Integer-Index
(1)
aus den Workbooks ausgewählt wurde - das Worksheets-Objekt - die Auflistung der im Workbook enthaltenen Worksheets
- das Worksheet-Objekt, welches per String-Index
("Tabelle1")
aus den Worksheets ausgewählt wurde - das Cells-Objekt - die Auflistung der Zellen dieser Tabelle
- ein Range-Objekt - die mit
(5,9)
addressierte Zelle
Es gibt noch 2 weitere Lösungen
- Quick & Dirty: Man kann mit der Process-Klasse den Excel-Prozess suchen und terminieren.
Ist nichtmal weiter kompliziert, jdfs. wenn man das Excel-Objekt selbst erstellt hat und unsichtbar belassen - dann kann man nachMainWindowTitle = ""
suchen, wie hier gezeigt. - Man kann - wenn man nur xls-Dateien bearbeiten will, ohne Excel-Anzeige - sich eine OpenSource-Excel-Library downloaden. Die hat bei weitem nicht den vollen Leistungs-Umfang von Excel-InterOp, aber für die meisten üblichen Erfordernisse wird es ausreichen, und ist darüberhinaus Resourcensparend und schneller.
Credits an:
- @simpelSoft, der brachte hier den oben verlinkten MSDN-Artikel auf: Excel Tabellen einer Mappe ermitteln und auflisten.
- @'Thisoft', für das Excel-Process-Kill() - Snippet
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()