Ich benutze C#, um Excel-Datei zu erstellen. Wenn mein Programm ausgeführt wird, wird die Excel-Instanz erstellt und im Task-Manager angezeigt. Das ist normal, aber wenn mein Programm beendet wird, sollte die Excel-Instanz nicht im Task-Manager angezeigt werden, aber es wird angezeigt. Bitte überprüfen Sie meinen Code und sagen Sie mir, was ist mein Fehler dort, was dazu führt, dass sich die Excel-Instanz im Task-Manager befindet, selbst nachdem ich meine Apps geschlossen habe. Hier ist mein Code.Interop.Excel: Excel-Instanz wird im Task-Manager angezeigt, nachdem das Programm existiert C#
Antwort
Jedes Mal, wenn Sie ein Mitglied eines COM-Objekts aufrufen, muss dieses Objekt einer Variablen zugewiesen und explizit freigegeben werden. Zum Beispiel dieser:
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
Erzeugt einen nicht freigegebenen Verweis auf .Worksheets
. Es braucht
var worksheets = (Excel.Worksheet)xlWorkBook.Worksheets;
xlWorkSheet = worksheets.get_Item(1);
und schließlich
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets);
Es sei denn jedes COM-Objekt zu sein, wird die Anwendung freigegeben bleiben läuft.
Um mit ihm zu arbeiten fand ich mich entweder sehr viele try/finally
Blöcke oder Hilfsfunktionen für Fälle wie die obige, dass die Schaffung des Anrufs zu .Worksheets
und sicherstellen würde wickeln, dass alle erstellten Objekte veröffentlicht wurden. Es kann funktionieren, aber es scheint den Vorteil zu negieren, in einem Framework zu arbeiten, das ansonsten die Garbage Collection behandelt. Wir alle wissen Dispose
ein IDisposable
, aber es ist offensichtlich nicht intuitiv, dass man ein Objekt freigeben müsste, dass a) nicht explizit erstellt wurde und b) IDisposable
nicht implementiert, und die Folgen davon nicht zu wissen (oder eine einzige zu machen Fehler) Excel-Instanzen im Hintergrund ausgeführt werden. (End of rant.)
Meine ernsthafte Empfehlung ist es, wenn möglich Interop und Automatisierung zu vermeiden. Wenn Sie Excel generieren müssen, versuchen Sie eine Bibliothek wie EPPlus. Das Interop wurde entworfen, bevor Excel-Objekte im Wesentlichen gezippte Sammlungen von XML-Dokumenten wurden. Jetzt müssen Sie Excel nicht einmal installieren oder ausführen, um Dokumente zu erstellen oder zu bearbeiten. Das Format, in dem sie gespeichert sind, ist verwirrend, aber die Bibliothek verbirgt das meistens für Sie. Der von Ihnen geschriebene Code kann sogar auf einem Webserver ausgeführt werden und in Reaktion auf Webanforderungen in Echtzeit Excel generieren.
Was ist Fehler in meinem Code, den Sie gesehen haben? Ich habe auch Excel bezogen auf alle Objekte aufgeräumt. –
- 1. C# Konsole wird nicht geschlossen, nachdem das Programm endet
- 2. Führen Sie das Ereignis aus, nachdem winform angezeigt wird C#
- 3. Programm wird nicht angezeigt
- 4. Unicode in C++, das nicht im Mac-Terminal angezeigt wird
- 5. Wie kann ich meinem Programm eine Beschreibung (-> description-column im Taskmanager) hinzufügen (VS 2008, C++)
- 6. Bild wird nicht angezeigt - Programm wird eingefroren
- 7. ProgressDialog wird angezeigt, nachdem XML abgerufen wurde
- 8. Größe NSPopover ändern, nachdem es angezeigt wird
- 9. Shellcode im C-Programm
- 10. Wie können Sie verhindern, dass die Konsole geschlossen wird, nachdem das Programm in C ausgeführt wurde?
- 11. zusätzliche Zeile angezeigt wird, nachdem längste Linie
- 12. C# WPF) Wie minimiert man ein Elternfenster, nachdem das Kindmodalfenster von showdialog() angezeigt wird?
- 13. Suchen von Zeichenfolgen, je nachdem, was zuerst angezeigt wird
- 14. break beendet das Programm - C++
- 15. iPython reagiert nicht, während das Programm ausgeführt wird. Wird antworten, wenn das Programm beendet wird
- 16. tkinter - Funktion ausführen, nachdem der Rahmen angezeigt wird
- 17. C# Splash Screen wird nicht angezeigt
- 18. Interrupt-Programm im Debugger, wenn C++ Ausnahme ausgelöst wird
- 19. Warum wird meine Ausgabe nicht angezeigt, bis das Programm beendet wird?
- 20. Wie wird die Modulladeadresse im Überwachungsfenster angezeigt?
- 21. Wie wird das angegebene Programm ausgeführt?
- 22. Das Bild wird nicht angezeigt
- 23. Das Programm schlägt fehl `cout` angezeigt wird, wenn es ausgeführt wird
- 24. Shell-Programm in C, laufendes Programm im Hintergrund
- 25. Erhalten Systemausgabe im C-Programm
- 26. Warum wird das Programm ausgegeben?
- 27. Programm kann nicht geladen werden, nachdem das Bit setuid auf
- 28. PyQt4-Fenster wird nicht angezeigt, während das Programm ausgeführt wird, aber auf ipython
- 29. C Programm wird nicht beendet?
- 30. Das Symbol wird nicht im CAB-Installationsprogramm angezeigt.
1) Stellen Sie sicher, dass Excel nicht ausgeführt wird, bevor Sie dies testen. –
2) Die Aufrufe von Close() und ReleaseObject() sollten in einem finally-Block sein –
Meiner Erfahrung nach ist es in der Regel, dass Ihre App Referenzen auf COM-Objekte aufgrund von "doppelten Punkten" speichert - siehe [Excel-Interop ordnungsgemäß bereinigen Objekte?] (http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects/158752#158752), oder weil Dokumente ungesichert sind - siehe [_Application.Quit-Methode - MSDN] (https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._application.quit.aspx) – Tone