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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich heraus, aus der CLR-team selbst, in der Tat ist es nicht sicher -es sei denndie Sie zuordnen ein GCHandle auf den RCW, während es immer noch sicher, dies zu tun (wenn Sie zunächst erwerben die RCW). Dies stellt sicher, dass die GC-und finalizer noch nicht erreichte der RCW, bevor die managed objects, die benötigt, um es aufzurufen ist abgeschlossen.
Es stellt sich heraus in meinem insbesondere Fall, meine app hosting der CLR selbst. Also, es ist Berufung mscoree!CoEEShutdownCOM, bevor der finalizer-thread zum laufen bekommt, das tötet die RCW und die Ergebnisse in die
InvalidComObjectException
Fehler, die ich sah.Aber in normalen Fällen, in denen die CLR ist nicht das hosting selbst, habe ich gesagt, dass das funktionieren sollte.
InformationsquelleAutor der Antwort Andrew Arnott
Nein, es ist nicht sicher, um Zugang zu einem RCW aus der finalizer-thread. Wenn Sie erreichen die finalizer-thread hast du keine Garantie, dass der RCW ist noch am Leben. Es ist für Sie möglich, einen Schritt Voraus zu sein Ihr Objekt in die finalizer-Warteschlange und damit veröffentlicht durch die Zeit, Ihre destructor läuft auf der finalizer-thread.
InformationsquelleAutor der Antwort JaredPar