Comparteix a través de


CriticalFinalizerObject Clase

Definición

Garantiza que todo el código de finalización en clases derivadas se marca como crítico.

public ref class CriticalFinalizerObject abstract
public abstract class CriticalFinalizerObject
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CriticalFinalizerObject
type CriticalFinalizerObject = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type CriticalFinalizerObject = class
Public MustInherit Class CriticalFinalizerObject
Herencia
CriticalFinalizerObject
Derivado
Atributos

Ejemplos

En el ejemplo de código siguiente se muestra el uso de la SafeFileHandle clase para proporcionar una finalización crítica para los flujos de entrada y salida estándar. El SafeFileHandle, derivado de la SafeHandle clase , se pasa a la secuencia de archivos en el FileStream constructor .

using System;
using System.Runtime.InteropServices;
using System.IO;
using Microsoft.Win32.SafeHandles;

namespace CriticalFinalizer
{
    class Program
    {
        const int STD_INPUT_HANDLE   = -10;
        const int STD_OUTPUT_HANDLE = -11;
        const int STD_ERROR_HANDLE  =  -12;
        [DllImport("Kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern IntPtr GetStdHandle(int type);

        static void Main(string[] args)
        {
            FileStream fsIn = null;
            FileStream fsOut = null;
            try
            {
                SafeFileHandle sfhIn = new SafeFileHandle(GetStdHandle(STD_INPUT_HANDLE), false);
                fsIn = new FileStream(sfhIn, FileAccess.Read);
                byte[] input = new byte[] {0};
                fsIn.Read(input,0,1);
                SafeFileHandle sfhOut = new SafeFileHandle(GetStdHandle(STD_OUTPUT_HANDLE), false);
                fsOut = new FileStream(sfhOut, FileAccess.Write);
                fsOut.Write(input,0,1);
                SafeFileHandle sf = fsOut.SafeFileHandle;
            }
            finally
            {
                if (fsIn != null)
                {
                    fsIn.Close();
                    fsIn = null;
                }
                if (fsOut != null)
                {
                    fsOut.Close();
                    fsOut = null;
                }
            }
        }
    }
}
Imports System.Runtime.InteropServices
Imports System.IO
Imports Microsoft.Win32.SafeHandles

Public Module Example
   Const STD_INPUT_HANDLE As Integer  = -10
   Const STD_OUTPUT_HANDLE As Integer = -11
   Const STD_ERROR_HANDLE As Integer  = -12

   Public Declare Auto Function GetStdHandle Lib "Kernel32" (type As Integer) As IntPtr

   Public Sub Main()
      Dim fsIn As FileStream = Nothing
      Dim fsOut As FileStream = Nothing

      Try
         Dim sfhIn As New SafeFileHandle(GetStdHandle(STD_INPUT_HANDLE), False)
         fsIn = new FileStream(sfhIn, FileAccess.Read)
         Dim input() As Byte = { 0 }
         fsIn.Read(input, 0, 1)
         Dim sfhOut As New SafeFileHandle(GetStdHandle(STD_OUTPUT_HANDLE), False)
         fsOut = New FileStream(sfhOut, FileAccess.Write)
         fsOut.Write(input, 0, 1)
         Dim sf As SafeFileHandle = fsOut.SafeFileHandle
      Finally
         If fsIn IsNot Nothing Then
            fsIn.Close()
            fsIn = Nothing
         End If
         If fsOut IsNot Nothing Then 
            fsOut.Close()
            fsOut = Nothing
         End If
      End Try
   End Sub
End Module

Comentarios

Las clases que derivan de la CriticalFinalizerObject clase se tratan implícitamente como una región de ejecución restringida (CER). Esto requiere código en el finalizador para llamar solo al código con un contrato de confiabilidad seguro. Para obtener más información sobre los CER, consulte el System.Runtime.ConstrainedExecution espacio de nombres .

En las clases derivadas de la CriticalFinalizerObject clase , Common Language Runtime (CLR) garantiza que se dará la oportunidad de ejecutar todo el código de finalización crítico, siempre que el finalizador siga las reglas de una CER, incluso en situaciones en las que CLR descargue forzosamente un dominio de aplicación o anule un subproceso. Si un finalizador infringe las reglas de una CER, es posible que no se ejecute correctamente. Además, CLR establece un orden débil entre finalizadores normales y críticos: para los objetos reclamados por la recolección de elementos no utilizados al mismo tiempo, se llama a todos los finalizadores no críticos antes de cualquiera de los finalizadores críticos. Por ejemplo, una clase como FileStream, que contiene datos de la SafeHandle clase derivada de CriticalFinalizerObject, puede ejecutar un finalizador estándar para vaciar los datos almacenados en búfer existentes.

En la mayoría de los casos, no es necesario escribir clases que deriven de la CriticalFinalizerObject clase . La biblioteca de clases .NET Framework proporciona dos clases, SafeHandle y CriticalHandle, que proporcionan funcionalidad de finalización crítica para controlar los recursos. Además, el .NET Framework proporciona un conjunto de clases preescritas derivadas de la SafeHandle clase y este conjunto se encuentra en el Microsoft.Win32.SafeHandles espacio de nombres . Estas clases están diseñadas para proporcionar una funcionalidad común para admitir identificadores de sistema operativo y de archivos.

Constructores

CriticalFinalizerObject()

Inicializa una nueva instancia de la clase CriticalFinalizerObject.

Métodos

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
Finalize()

Libera todos los recursos utilizados por la clase CriticalFinalizerObject.

GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a

Consulte también