Ich habe viele der anderen Threads hier über das Verwalten von COM-Referenzen gelesen, während Sie die .Net-Excel-Interop verwenden, um sicherzustellen, dass der Excel-Prozess beim Beenden korrekt beendet wird, und bis jetzt haben die Techniken sehr gut funktioniert, aber kürzlich beim Hinzufügen neuer Arbeitsblätter zu einer vorhandenen Arbeitsmappendatei auf ein Problem gestoßen.
Der folgende Code hinterlässt einen Zombie-Excel-Prozess.
Wenn ich ein Arbeitsblatt zu einer neu erstellten Arbeitsmappendatei hinzufüge, wird es ordnungsgemäß beendet. Wenn ich den Code ohne die Zeile .Add()
ausfühle, wird die Eingabe beendet. (Die vorhandene Datei, aus der ich lese, ist eine leere Datei, die durch den auskommentierten Code erstellt wurde)
Irgendwelche Ideen?
%Vor%Ich habe den Code nicht zur Hand, aber ich stieß auf ein ähnliches Problem. Wenn ich mich richtig erinnere, landete ich die Prozess-ID der Excel-Instanz und tötete sie (nach einer geeigneten Wartezeit und wenn die andere Methode fehlschlug).
Ich glaube, ich habe verwendet:
GetWindowThreadProcessId
(über P / Invoke) für die hwnd-Eigenschaft des Excel-Objekts, um die Prozess-ID abzurufen, und dann Process.GetProcessById
verwendet, um ein Prozessobjekt abzurufen.
Sobald ich das getan hatte, würde ich Kill
für den Prozess aufrufen.
EDIT: Ich muss zugeben, das ist nicht die ideale Lösung, aber wenn Sie nicht die Rogue-Schnittstelle finden, die nicht veröffentlicht wird, dann wird dies in echter Eierschale / Vorschlaghammer-Mode beheben. ;)
EDIT2: Sie müssen Kill
nicht sofort für das Prozessobjekt aufrufen ... Sie könnten zuerst Close
aufrufen, bevor Sie auf Kill
zurückgreifen.
Ich habe eine ähnliche Sache gemacht. Ich erstelle eine Excel-Datei oder öffne eine vorhandene. Ich lösche alle Blätter und füge meine eigenen hinzu. Hier ist der Code, den ich verwende, um sicherzustellen, dass alle Referenzen geschlossen sind:
%Vor%Ich habe das mit vielen verschiedenen Optionen getestet und hatte es noch nicht bei mir versagt.
Nicht sehr konstruktiv Ich weiß, aber ich habe den Code genau wie oben gezeigt getestet und mein Excel-Prozess beendet wie erwartet, mein C: \ addtest.xls sitzt mit 8 neuen Blättern und kein Excel-Prozess wird ausgeführt Interop-Version ist die Ursache, die ich frage mich? Ich habe mit 11 & amp getestet; 12.
Ich benutze VB.NET 3.5 SP1 und der folgende Code STILL lässt EXCEL.EXE geöffnet:
%Vor%