C # bereinigt nicht verwaltete Ressourcen, wenn der Prozess beendet wird

8

Ich habe eine Klasse, die eine COM-exe aus dem Prozess instanziiert. Die Klasse ist

%Vor%

und ich nenne es wie folgt

%Vor%

Jetzt bereinigt dies mein COM-Objekt, wenn das Programm normal ausgeführt wird. Wenn ich das Programm jedoch mitten in der Ausführung schließe, ruft das Framework niemals den Code auf, der mein nicht verwaltetes Objekt freigibt. Das ist fair genug. Gibt es jedoch eine Möglichkeit, das Programm zu zwingen, sich selbst zu reinigen, obwohl es getötet wurde?

BEARBEITEN: Es sieht nicht gut aus von einem harten Kill vom Taskmanager: (

    
Steve 24.03.2009, 20:56
quelle

2 Antworten

8

Wenn Sie es schließlich in eine try finally- oder using-Klausel einfügen, erhalten Sie den größten Teil des Weges dorthin:

%Vor%

Die Besonderheiten von wie Ihre App heruntergefahren wird , diktiert jedoch alles andere Maßnahmen, die Sie ausführen können (z. B. CriticalFinalizerObject ).

>

Ich denke , dass eine Konsolenanwendung, die geschlossen wird (vom kleinen x), dieselbe ist wie eine Strg-C - in diesem Fall können Sie abonnieren Sie hierfür Console.CancelKeyPress .

Bearbeiten: Sie sollten auch ReleaseComObject aufrufen, bis & lt; = 0 zurückgegeben wird .

    
Mark Brackett 24.03.2009, 21:11
quelle
5

Nun, eine bewährte Methode ist die Verwendung von using -Anweisungen:

%Vor%

Damit werden die finally Blöcke, die aufgerufen werden sollen, im Grunde automatisch am Ende des Bereichs angeordnet. Sie sollten using -Anweisungen haben, wenn Sie eine IDisposable-Instanz haben, für die Sie die Verantwortung übernehmen. Es behebt jedoch nicht die Situation, in der Ihr gesamter Prozess abrupt abgebrochen wird. Das ist jedoch ziemlich selten, und Sie möchten sich vielleicht nicht darum kümmern. (Es ist ziemlich schwierig, das zu umgehen.) Ich hätte erwartet , dass Ihr Finalizer mit Ihrem vorherigen Code aufgerufen wird.

    
Jon Skeet 24.03.2009 21:02
quelle

Tags und Links