次の方法で共有


CriticalFinalizerObject クラス

定義

派生クラスのすべての終了コードが確実に重大であるとマークされるようにします。

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
継承
CriticalFinalizerObject
派生
属性

次のコード例は、 クラスを SafeFileHandle 使用して、標準の入力ストリームと出力ストリームの重要なファイナライズを提供する方法を示しています。 SafeFileHandleクラスから派生した はSafeHandle、コンストラクター内のファイル ストリームにFileStream渡されます。

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

注釈

クラスから派生する CriticalFinalizerObject クラスは、制約付き実行領域 (CER) として暗黙的に扱われます。 これには、ファイナライザー内のコードで、強力な信頼性コントラクトを持つコードのみを呼び出す必要があります。 CER の詳細については、名前空間に関するページを System.Runtime.ConstrainedExecution 参照してください。

クラスから CriticalFinalizerObject 派生したクラスでは、共通言語ランタイム (CLR) は、CLR がアプリケーション ドメインを強制的にアンロードしたりスレッドを中止したりする場合でも、ファイナライザーが CER の規則に従っている場合に、すべての重要なファイナライズ コードに実行の機会が与えられることを保証します。 ファイナライザーが CER の規則に違反している場合は、正常に実行されない可能性があります。 さらに、CLR では、通常のファイナライザーとクリティカル ファイナライザーの間で弱い順序が確立されます。ガベージ コレクションによって同時に再利用されるオブジェクトの場合、クリティカルでないファイナライザーはすべて、クリティカルファイナライザーの前に呼び出されます。 たとえば、 から派生した CriticalFinalizerObjectクラス内SafeHandleのデータを保持する などのFileStreamクラスでは、標準ファイナライザーを実行して、既存のバッファー内のデータをフラッシュできます。

ほとんどの場合、 クラスから CriticalFinalizerObject 派生するクラスを記述する必要はありません。 .NET Framework クラス ライブラリには、SafeHandleリソースを処理するための重要なファイナライズ機能を提供する 2 つのクラス と CriticalHandleが用意されています。 さらに、.NET Frameworkは クラスから派生した一連の事前書き込みクラスをSafeHandle提供し、このセットは 名前空間にありますMicrosoft.Win32.SafeHandles。 これらのクラスは、ファイルとオペレーティング システムのハンドルをサポートするための一般的な機能を提供するように設計されています。

コンストラクター

CriticalFinalizerObject()

CriticalFinalizerObject クラスの新しいインスタンスを初期化します。

メソッド

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
Finalize()

CriticalFinalizerObject クラスで使用されたすべてのリソースを解放します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象

こちらもご覧ください