Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.
La classe SafeHandle fornisce una finalizzazione critica delle risorse di handle, impedendo che gli handle vengano recuperati prematuramente dalla garbage collection e riciclati dal sistema operativo per riferirsi a oggetti non gestiti involontariamente.
Perché SafeHandle?
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 di invocazione di piattaforma, potrebbe causare la corruzione dell'handle. L'handle può essere recuperato anche quando il metodo viene bloccato durante una chiamata di invocazione della piattaforma, ad esempio mentre si legge un file.
L'aspetto più critico è che, poiché Windows ricicla gli handle in maniera aggressiva, 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 SafeHandle
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, FileStream oggetto può eseguire un finalizzatore normale per eliminare i dati già memorizzati nel buffer senza il rischio di dispersione o riutilizzo 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, come il metodo SafeHandle.ReleaseHandle(), deve trovarsi in un'area vincolata di esecuzione. 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, e li decrementano 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. Questa impostazione controlla se l'oggetto SafeHandle rilascerà l'handle dopo che l'oggetto è stato eliminato. Ciò è utile per gli handle con requisiti di durata specifici o per usare un handle la cui durata è controllata da qualcun altro.
Classi derivate da SafeHandle
SafeHandle è una classe wrapper astratta per gli handle del sistema operativo. La derivazione da questa classe è difficile. Invece, usa le classi derivate nel Microsoft.Win32.SafeHandles namespace che forniscono handle sicuri per i seguenti:
- File (la classe SafeFileHandle).
- File mappati alla memoria (classe SafeMemoryMappedFileHandle).
- Pipes (la classe SafePipeHandle ).
- Visualizzazioni di memoria (classe SafeMemoryMappedViewHandle ).
- Costrutti di crittografia (le SafeNCryptHandleclassi , SafeNCryptKeyHandleSafeNCryptProviderHandle, e SafeNCryptSecretHandle ).
- Processi (la SafeProcessHandle classe ).
- Chiavi del Registro di sistema (classe SafeRegistryHandle ).
- Classe delle handle di attesa (SafeWaitHandle).