C # interop: Excel-Prozess wird nicht beendet, nachdem ein neues Arbeitsblatt zur vorhandenen Datei hinzugefügt wurde [duplizieren]

8

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%     
yoyoyoyosef 08.12.2008, 18:50
quelle

7 Antworten

4

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.

    
Andrew Rollings 08.12.2008, 19:14
quelle
13

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.

    
Jon 10.12.2008 15:56
quelle
4

Hier ist mein vollständiger Code zum Beenden des Excel, das Sie mit der Office12.Net-Interop-Bibliothek erstellt haben: Genießen, -Alan.

%Vor%     
AlanR 16.02.2010 15:27
quelle
1

Das funktioniert sehr gut für mich, ohne Ausnahmen.

%Vor%     
io.gun 09.08.2011 21:02
quelle
0

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.

    
Simon Wilson 08.12.2008 20:22
quelle
0

Ich benutze VB.NET 3.5 SP1 und der folgende Code STILL lässt EXCEL.EXE geöffnet:

%Vor%     
David 19.02.2009 15:04
quelle
0

Andrew, hier ist der Code, den ich gefunden habe, der funktioniert. Ich dachte, ich poste es hier für andere, die rüberkommen:

%Vor%     
Nazadus 16.03.2009 14:57
quelle

Tags und Links