System.Runtime.InteropServices. Caja fuerte Handle (clase)

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

La SafeHandle clase proporciona una finalización crítica de los recursos de identificador, lo que impide que la recolección de elementos no utilizados recupere los identificadores prematuramente y que el sistema operativo pueda reciclarlos para hacer referencia a objetos no administrados no deseados.

¿Por qué Caja fuerte Handle?

Aunque las invalidaciones en el Object.Finalize método permiten la limpieza de recursos no administrados cuando se recopila un objeto, en algunas circunstancias, los objetos finalizables se pueden reclamar mediante la recolección de elementos no utilizados mientras se ejecuta un método dentro de una llamada de invocación de plataforma. Si un finalizador libera el identificador pasado a esa llamada de invocación de plataforma, podría provocar daños. El identificador también se puede reclamar mientras el método está bloqueado durante una llamada de invocación de plataforma, como al leer un archivo.

De forma más crítica, dado que Windows recicla de forma agresiva los identificadores, se podría reciclar un identificador y apuntar a otro recurso que podría contener datos confidenciales. Esto se conoce como un ataque de reciclaje y puede dañar los datos y ser una amenaza de seguridad.

Qué hace Caja fuerte Handle

La SafeHandle clase simplifica varios de estos problemas de duración de objetos y se integra con la invocación de plataforma para que no se filtren los recursos del sistema operativo. La SafeHandle clase resuelve los problemas de duración del objeto mediante la asignación y liberación de identificadores sin interrupción. Contiene un finalizador crítico que garantiza que el identificador está cerrado y que se garantiza que se ejecute durante descargas inesperadas AppDomain , incluso en casos en los que se supone que la llamada de invocación de plataforma está en un estado dañado.

Dado que SafeHandle hereda de CriticalFinalizerObject, se llama a todos los finalizadores no críticos antes de cualquiera de los finalizadores críticos. Se llama a los finalizadores en objetos que ya no están activos durante el mismo paso de recolección de elementos no utilizados. Por ejemplo, un FileStream objeto puede ejecutar un finalizador normal para vaciar los datos almacenados en búfer existentes sin el riesgo de que el identificador se filtre o se recicla. Este orden muy débil entre finalizadores críticos y no críticos no está pensado para uso general. Existe principalmente para ayudar en la migración de bibliotecas existentes al permitir que esas bibliotecas usen SafeHandle sin modificar su semántica. Además, el finalizador crítico y todo lo que llama, como el SafeHandle.ReleaseHandle() método, debe estar en una región de ejecución restringida. Esto impone restricciones sobre qué código se puede escribir en el gráfico de llamadas del finalizador.

Las operaciones de invocación de plataforma incrementan automáticamente el recuento de referencias de los identificadores encapsulados por y SafeHandle los reducen tras la finalización. Esto garantiza que el mango no se reciclará ni se cerrará inesperadamente.

Puede especificar la propiedad del identificador subyacente al construir SafeHandle objetos proporcionando un valor al ownsHandle argumento en el constructor de clase SafeHandle . Esto controla si el SafeHandle objeto liberará el identificador una vez eliminado el objeto. Esto es útil para controlar con requisitos de duración peculiares o para consumir un identificador cuya duración está controlada por otra persona.

Clases derivadas de Caja fuerte Handle

SafeHandle es una clase contenedora abstracta para los identificadores del sistema operativo. Es difícil derivar de esta clase. En su lugar, use las clases derivadas del espacio de nombres Microsoft.Win32.SafeHandles que proporcionan controladores seguros para lo siguiente: