Compartir a través de


Método SafeHandle.ReleaseHandle ()

 

Publicado: octubre de 2016

Cuando se invalida en una clase derivada, ejecuta el código necesario para liberar el identificador.

Espacio de nombres:   System.Runtime.InteropServices
Ensamblado:  mscorlib (en mscorlib.dll)

Sintaxis

protected abstract bool ReleaseHandle()
protected:
virtual bool ReleaseHandle() abstract
abstract ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle As Boolean

Valor devuelto

Type: System.Boolean

true si el identificador se libera correctamente; en caso contrario, si se produce un error grave, false. En este caso, genera un Ayudante para la depuración administrada releaseHandleFailed MDA.

Comentarios

El ReleaseHandle se garantiza que el método se llama solo una vez y solo si el identificador es válido de acuerdo con la IsInvalid propiedad. Implemente este método en su SafeHandle sus clases derivadas para ejecutar cualquier código necesario para liberar el identificador. Dado que una de las funciones de SafeHandle es garantizar la prevención de pérdidas de recursos, el código de la implementación de ReleaseHandle nunca debe producir un error. El recolector de elementos no utilizados llame ReleaseHandledespués de que se han ejecutado los finalizadores normales para objetos no utilizados recolectados al mismo tiempo. El recolector de elementos no utilizados garantiza que los recursos para invocar este método y el método no se interrumpirá mientras está en curso. En el momento de construcción de la instancia (junto con todos los métodos en su gráfico de llamadas determinable estáticamente), se preparará este método como una región de ejecución restringida (CER). Aunque esto evita las interrupciones de anulación de subproceso, aún debe procurar no introducir ninguna ruta de acceso de error en su ReleaseHandle método. En particular, aplique el ReliabilityContractAttribute atributo a los métodos que llama desde ReleaseHandle. En la mayoría de los casos este código debería ser:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Además, para la limpieza sencilla (por ejemplo, al llamar a la API Win32 CloseHandle en un identificador de archivo) puede comprobar el valor devuelto de la llamada de invocación de la plataforma. Para la limpieza compleja, puede tener mucha lógica del programa y muchas llamadas a métodos, algunos de los cuales pueden producir un error. Debe asegurarse de que la lógica del programa tiene código de reserva para cada uno de esos casos.

Si ReleaseHandle devuelve false por cualquier motivo, genera un releaseHandleFailed MDA Ayudante de depuración administrada. Esto ayuda a detectar los casos donde se produce un error en el intento de liberar recursos.

Ejemplos

En el ejemplo de código siguiente se libera el identificador y forma parte de un ejemplo mayor proporcionado para el SafeHandle clase.

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
override protected bool ReleaseHandle()
{
    // Here, we must obey all rules for constrained execution regions.
    return NativeMethods.CloseHandle(handle);
    // If ReleaseHandle failed, it can be reported via the
    // "releaseHandleFailed" managed debugging assistant (MDA).  This
    // MDA is disabled by default, but can be enabled in a debugger
    // or during testing to diagnose handle corruption problems.
    // We do not throw an exception because most code could not recover
    // from the problem.
}

Seguridad

SecurityPermission

for permission to call unmanaged code. Security action: F:System.Security.Permissions.SecurityAction.LinkDemand. Associated enumeration: F:System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode

Información de versión

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 2.0
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1

Ver también

Clase SafeHandle
Espacio de nombres System.Runtime.InteropServices
Diagnosing Errors with Managed Debugging Assistants
releaseHandleFailed MDA

Volver al principio