Freigeben über


System.runtime.interopservices. Tresor Handle-Klasse

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Die SafeHandle Klasse stellt eine kritische Abschließendkeit von Handle-Ressourcen bereit, die verhindern, dass Handles vorzeitig von der Garbage Collection zurückgefordert werden und vom Betriebssystem wiederverwendet werden, um auf unbeabsichtigte nicht verwaltete Objekte zu verweisen.

Warum Tresor Handle?

Außerkraftsetzungen der Object.Finalize Methode ermöglichen zwar die sauber up von nicht verwalteten Ressourcen, wenn ein Objekt garbage collection wird, in einigen Fällen können finalisierbare Objekte jedoch von der Garbage Collection zurückgefordert werden, während eine Methode innerhalb eines Plattformaufrufs ausgeführt wird. Wenn ein Finalizer das handle freigibt, das an diesen Plattformaufruf übergeben wird, kann es zu einer Beschädigung führen. Das Handle kann auch reaktiviert werden, während die Methode während eines Plattformaufrufs blockiert wird, z. B. beim Lesen einer Datei.

Wichtiger ist jedoch, dass Ein Handle von Windows aggressiv wiederverwendet wird und auf eine andere Ressource verweist, die vertrauliche Daten enthalten kann. Dies wird als Wiederverwertungsangriff bezeichnet und kann potenziell Daten beschädigen und eine Sicherheitsrisiken darstellen.

Funktionsweise von Tresor Handle

Die SafeHandle Klasse vereinfacht mehrere dieser Probleme bei der Objektlebensdauer und ist in den Plattform-Aufruf integriert, sodass Betriebssystemressourcen nicht verloren gehen. Die SafeHandle Klasse behebt Probleme mit der Objektlebensdauer, indem Handles ohne Unterbrechung zugewiesen und freigegeben werden. Es enthält einen kritischen Finalizer, der sicherstellt, dass das Handle geschlossen wird und während unerwarteter AppDomain Entladen garantiert ausgeführt wird, auch wenn der Aufruf der Plattform angenommen wird, dass er in einem beschädigten Zustand ist.

Da SafeHandle erbt von CriticalFinalizerObject, werden alle nicht kritischen Finalizer vor einem der kritischen Finalisierer aufgerufen. Die Finalizer werden für Objekte aufgerufen, die während desselben Garbage Collection-Durchlaufs nicht mehr leben. Ein Objekt kann z. B. einen normalen Finalizer ausführen, um vorhandene gepufferte Daten auszulöschen, ohne dass das Risiko besteht, FileStream dass der Handle gelecket oder wiederverwendet wird. Diese sehr schwache Sortierung zwischen kritischen und nicht kritischen Finalizern ist nicht für die allgemeine Verwendung vorgesehen. Es besteht in erster Linie zur Unterstützung bei der Migration vorhandener Bibliotheken, indem diese Bibliotheken die Verwendung SafeHandle ermöglichen, ohne ihre Semantik zu ändern. Darüber hinaus muss sich der kritische Finalizer und alles, was er aufruft, wie die SafeHandle.ReleaseHandle() Methode, in einem eingeschränkten Ausführungsbereich befinden. Dies legt Einschränkungen fest, welche Code innerhalb des Aufrufdiagramms des Finalizers geschrieben werden können.

Plattformaufrufvorgänge erhöhen automatisch die Referenzanzahl der Handles, die nach Abschluss von einer SafeHandle Kapselung gekapselt wurden, und erhöhen sie. Dadurch wird sichergestellt, dass der Ziehpunkt nicht unerwartet wiederverwendet oder geschlossen wird.

Sie können den Besitz des zugrunde liegenden Handles beim Erstellen SafeHandle von Objekten angeben, indem Sie dem ownsHandle Argument im SafeHandle Klassenkonstruktor einen Wert bereitstellen. Dadurch wird gesteuert, ob das SafeHandle Objekt das Handle nach dem Löschen des Objekts loslassen wird. Dies ist nützlich für Handles mit besonderen Lebensanforderungen oder für den Verbrauch eines Handles, dessen Lebensdauer von jemand anderem gesteuert wird.

Von Tresor Handle abgeleitete Klassen

SafeHandle ist eine abstrakte Wrapperklasse für Betriebssystemhandles. Das Ableiten von dieser Klasse ist schwierig. Verwenden Sie stattdessen die abgeleiteten Klassen im Microsoft.Win32.SafeHandles-Namespace, die sichere Handles für Folgendes bereitstellen: