See Also: CriticalFinalizerObject Members
Classes deriving from the System.Runtime.ConstrainedExecution.CriticalFinalizerObject class are implicitly treated as a constrained execution region (CER). This requires code in the finalizer to only call code with a strong reliability contract. For more information about CERs, see the System.Runtime.ConstrainedExecution namespace.
In classes derived from the System.Runtime.ConstrainedExecution.CriticalFinalizerObject class, the common language runtime (CLR) guarantees that all critical finalization code will be given the opportunity to execute, provided the finalizer follows the rules for a CER, even in situations where the CLR forcibly unloads an application domain or aborts a thread. If a finalizer violates the rules for a CER, it might not successfully execute. In addition, the CLR establishes a weak ordering among normal and critical finalizers: for objects reclaimed by garbage collection at the same time, all the noncritical finalizers are called before any of the critical finalizers. For example, a class such as System.IO.FileStream, which holds data in the System.Runtime.InteropServices.SafeHandle class that is derived from System.Runtime.ConstrainedExecution.CriticalFinalizerObject, can run a standard finalizer to flush out existing buffered data.
In most cases, you do not need to write classes that derive from the System.Runtime.ConstrainedExecution.CriticalFinalizerObject class. The .NET Framework class library provides two classes, System.Runtime.InteropServices.SafeHandle and System.Runtime.InteropServices.CriticalHandle, that provide critical finalization functionality for handle resources. Furthermore, the .NET Framework provides a set of prewritten classes derived from the System.Runtime.InteropServices.SafeHandle class, and this set is located in the Microsoft.Win32.SafeHandles namespace. These classes are designed to provide common functionality for supporting file and operating system handles.