System.runtime.interopservices. Classe Cassaforte Handle

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

La SafeHandle classe fornisce la finalizzazione critica delle risorse di handle, impedendo che gli handle vengano recuperati prematuramente da Garbage Collection e vengano riciclati dal sistema operativo per fare riferimento a oggetti non gestiti non intenzionali.

Perché Cassaforte Handle?

Sebbene gli override al Object.Finalize metodo consentano la pulizia delle risorse non gestite quando un oggetto viene sottoposto a Garbage Collection, in alcune circostanze, gli oggetti finalizzabili possono essere recuperati da Garbage Collection durante l'esecuzione di un metodo all'interno di una chiamata platform invoke. Se un finalizzatore libera l'handle passato a tale chiamata platform invoke, potrebbe causare la gestione del danneggiamento. L'handle può anche essere recuperato mentre il metodo viene bloccato durante una chiamata platform invoke, ad esempio durante la lettura di un file.

In modo più critico, poiché Windows ricicla in modo aggressivo gli handle, un handle potrebbe essere riciclato e puntare a un'altra risorsa che potrebbe contenere dati sensibili. Questo comportamento è noto come attacco di riciclo e può potenzialmente danneggiare i dati e costituire una minaccia per la sicurezza.

Cosa fa Cassaforte Handle

La SafeHandle classe semplifica diversi di questi problemi di durata degli oggetti ed è integrato con platform invoke in modo che le risorse del sistema operativo non vengano perse. La SafeHandle classe risolve i problemi di durata degli oggetti assegnando e rilasciando handle senza interruzioni. Contiene un finalizzatore critico che garantisce che l'handle venga chiuso e che venga eseguito durante gli scaricamenti imprevisti AppDomain , anche nei casi in cui si presuppone che la chiamata platform invoke sia in uno stato danneggiato.

Poiché SafeHandle eredita da CriticalFinalizerObject, tutti i finalizzatori non critici vengono chiamati prima di uno dei finalizzatori critici. I finalizzatori vengono chiamati su oggetti che non sono più attivi durante lo stesso passaggio di Garbage Collection. Ad esempio, un FileStream oggetto può eseguire un finalizzatore normale per scaricare i dati memorizzati nel buffer esistenti senza il rischio di perdita o riciclo dell'handle. Questo ordinamento molto debole tra finalizzatori critici e non critici non è destinato all'uso generale. Esiste principalmente per facilitare la migrazione delle librerie esistenti consentendo a tali librerie di usare SafeHandle senza modificarne la semantica. Inoltre, il finalizzatore critico e tutto ciò che chiama, ad esempio il SafeHandle.ReleaseHandle() metodo , deve trovarsi in un'area di esecuzione vincolata. Ciò impone vincoli sul codice che può essere scritto all'interno del grafico delle chiamate del finalizzatore.

Le operazioni platform invoke incrementano automaticamente il conteggio dei riferimenti degli handle incapsulati da un SafeHandle oggetto e li decrementa al completamento. In questo modo si garantisce che l'handle non venga riciclato o chiuso in modo imprevisto.

È possibile specificare la proprietà dell'handle sottostante durante la costruzione di SafeHandle oggetti fornendo un valore all'argomento ownsHandle nel costruttore della SafeHandle classe. In questo modo viene verificato se l'oggetto rilascia l'handle SafeHandle dopo l'eliminazione dell'oggetto. Ciò è utile per gestire requisiti di durata specifici o per l'utilizzo di un handle la cui durata è controllata da un altro utente.

Classi derivate da Cassaforte Handle

SafeHandle è una classe wrapper astratta per gli handle del sistema operativo. La derivazione da questa classe è difficile. Utilizzare invece le classi derivate nello spazio dei nomi Microsoft.Win32.SafeHandles che forniscono handle sicuri per gli elementi seguenti: