Ist es sicher, rufen Sie einen RCW vom finalizer?

Habe ich ein verwaltetes Objekt, ruft einen COM-server zu reservieren von Speicher. Das verwaltete Objekt aufrufen muss, den COM-server wieder zu befreien, dass der Speicher, bevor Sie das verwaltete Objekt geht Weg, um Speicherlecks zu vermeiden. Dieses Objekt implementiert IDisposable um sicherzustellen, dass Sie den richtigen Speicher-releasing-COM-Aufruf gemacht wird.

In dem Fall, dass die Dispose Methode ist nicht genannt, ich möchte das Objekt finalizer den Speicher frei. Das Problem ist, die Regeln der Fertigstellung ist, müssen Sie nicht auf jede Referenz, weil Sie nicht wissen, welche anderen Objekte haben schon GC würd und/oder abgeschlossen werden, bevor Sie. Dies lässt die nur berührbare Objekt Status-Felder (Griffe am häufigsten).

Aber das aufrufen eines COM-Servers müssen Sie gehen durch eine runtime callable wrapper (RCW), um den Speicher frei, dass ich ein cookie gespeichert in einem Feld. Ist, dass RCW sicher Anruf von einem finalizer (ist es garantiert nicht gewesen GC würde oder abgeschlossen an dieser Stelle)?

Für diejenigen von Ihnen nicht vertraut mit Abschluss, obwohl der finalizer-thread läuft im hintergrund des verwalteten appdomain, während Sie läuft, in den Fällen berühren, Verweise theoretisch müsste das OK sein, die Fertigstellung geschieht auch bei appdomain Herunterfahren, und in beliebiger Reihenfolge - nicht nur in Bezug Beziehung um. Diese Grenzen, was können Sie davon ausgehen, sicher zu berühren, von Ihr finalizer. Jede Referenz auf ein verwaltetes Objekt sein könnte, "schlechte" (collected memory), auch wenn die Referenz nicht null ist.

Update: ich habe es gerade ausprobiert und bekam diese:

Eine nicht behandelte Ausnahme des Typs 'System.- Laufzeit.InteropServices.InvalidComObjectException " ist in myassembly.dll

Zusätzliche Informationen: der COM-Objekt, das wurde vom zugrunde liegenden RCW getrennt verwendet werden können.

InformationsquelleAutor der Frage Andrew Arnott | 2009-10-15

Schreibe einen Kommentar