Ist es sicher, einen RCW von einem Finalizer aus anzurufen?

Ich habe ein verwaltetes Objekt, das einen COM-Server aufruft, um Speicher zuzuweisen. Das verwaltete Objekt muss den COM-Server erneut aufrufen, um diesen Speicher freizugeben, bevor das verwaltete Objekt verschwindet, um einen Speicherverlust zu vermeiden. Dieses Objekt implementiertIDisposable um sicherzustellen, dass der richtige speicherfreigebende COM-Aufruf erfolgt.

Für den Fall, dass dieDispose Methode istnicht Aufgerufen, möchte ich, dass der Finalizer des Objekts den Speicher freigibt. Das Problem ist, dass Sie nach den Finalisierungsregeln auf keine Referenz zugreifen dürfen, da Sie nicht wissen, welche anderen Objekte bereits vor Ihnen gecodet und / oder finalisiert wurden. Dies belässt den einzigen berührbaren Objektstatus bei Feldern (die am häufigsten verwendeten Handles sind).

Das Aufrufen eines COM-Servers erfordert jedoch das Durchlaufen eines Runtime Callable Wrappers (RCW), um den Speicher freizugeben, in dem ein Cookie in einem Feld gespeichert werden soll.Ist es sicher, dass RCW von einem Finalizer angerufen wird (ist garantiert, dass es zu diesem Zeitpunkt noch nicht GC-geprüft oder finalisiert wurde)?

Wenn Sie mit der Finalisierung nicht vertraut sind, obwohl der Finalisiererthread im Hintergrund einer verwalteten Appdomain ausgeführt wird, und in diesen Fällen das Berühren von Referenzen theoretisch in Ordnung wäre, erfolgt die Finalisierung auch beim Herunterfahren der Appdomain undIn irgendeiner Reihenfolge - Nicht nur in der Reihenfolge der Referenzbeziehungen. Dies schränkt die Wahrscheinlichkeit ein, dass Sie den Finalizer sicher berühren können. Jeder Verweis auf ein verwaltetes Objekt ist möglicherweise "fehlerhaft" (gesammelter Speicher), obwohl der Verweis nicht null ist.

Aktualisieren: Ich habe es gerade ausprobiert und Folgendes bekommen:

In myassembly.dll ist eine nicht behandelte Ausnahme vom Typ "System.Runtime.InteropServices.InvalidComObjectException" aufgetreten

Zusätzliche Informationen: COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage