2016-04-29 7 views
0

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#

+1

1) Stellen Sie sicher, dass Excel nicht ausgeführt wird, bevor Sie dies testen. –

+0

2) Die Aufrufe von Close() und ReleaseObject() sollten in einem finally-Block sein –

+1

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

Antwort

1

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.

+0

Was ist Fehler in meinem Code, den Sie gesehen haben? Ich habe auch Excel bezogen auf alle Objekte aufgeräumt. –

Verwandte Themen