System.runtime.interopservices. classe Coffre Handle

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

La SafeHandle classe fournit une finalisation critique des ressources de handle, empêchant les handles d’être récupérés prématurément par le garbage collection et d’être recyclés par le système d’exploitation pour référencer des objets non managés involontaires.

Pourquoi Coffre Handle ?

Bien que les remplacements de la Object.Finalize méthode autorisent propre up de ressources non managées lorsqu’un objet est récupéré par le garbage collect, dans certaines circonstances, les objets finalisables peuvent être récupérés par garbage collection lors de l’exécution d’une méthode dans un appel d’appel de plateforme. Si un finaliseur libère le handle passé à cet appel d’appel de plateforme, il peut entraîner une corruption. Le handle peut également être récupéré pendant que votre méthode est bloquée pendant un appel d’appel de plateforme, par exemple lors de la lecture d’un fichier.

Plus critiquement, étant donné que Windows recycle de manière agressive les handles, un handle peut être recyclé et pointer vers une autre ressource qui peut contenir des données sensibles. Il s’agit d’une attaque de recyclage et peut potentiellement endommager les données et être une menace de sécurité.

Que fait Coffre Handle

La SafeHandle classe simplifie plusieurs de ces problèmes de durée de vie d’objet et est intégrée à l’appel de plateforme afin que les ressources du système d’exploitation ne soient pas divulguées. La SafeHandle classe résout les problèmes de durée de vie des objets en affectant et en libérant des handles sans interruption. Il contient un finaliseur critique qui garantit que le handle est fermé et qu’il est garanti qu’il s’exécute pendant les déchargements inattendus AppDomain , même dans les cas où l’appel d’appel de plateforme est supposé être dans un état endommagé.

Comme SafeHandle hérite de CriticalFinalizerObject, tous les finaliseurs non critiques sont appelés avant l’un des finaliseurs critiques. Les finaliseurs sont appelés sur des objets qui ne vivent plus pendant la même passe de garbage collection. Par exemple, un FileStream objet peut exécuter un finaliseur normal pour vider les données mises en mémoire tampon existantes sans risque de fuite ou de recyclage du handle. Cet ordre très faible entre les finaliseurs critiques et non critiques n’est pas destiné à une utilisation générale. Il existe principalement pour faciliter la migration des bibliothèques existantes en permettant à ces bibliothèques d’utiliser SafeHandle sans modifier leur sémantique. En outre, le finaliseur critique et tout ce qu’il appelle, tel que la SafeHandle.ReleaseHandle() méthode, doit se trouver dans une région d’exécution contrainte. Cela impose des contraintes sur le code qui peut être écrit dans le graphique d’appel du finaliseur.

Les opérations d’appel de plateforme incrémentent automatiquement le nombre de handles encapsulés par un SafeHandle et les décrémentent à la fin. Cela garantit que la poignée ne sera pas recyclée ou fermée de façon inattendue.

Vous pouvez spécifier la propriété du handle sous-jacent lors de la construction d’objets SafeHandle en fournissant une valeur à l’argument ownsHandle dans le SafeHandle constructeur de classe. Cela contrôle si l’objet SafeHandle libère le handle une fois l’objet supprimé. Cela est utile pour les poignées avec des exigences particulières de durée de vie ou pour consommer un handle dont la durée de vie est contrôlée par quelqu’un d’autre.

Classes dérivées de Coffre Handle

SafeHandle est une classe wrapper abstraite pour les handles du système d’exploitation. La dérivation de cette classe est difficile. Utilisez plutôt les classes dérivées dans l'espace de noms Microsoft.Win32.SafeHandles qui fournissent des handles sécurisés pour les éléments suivants :