SafeHandle.ReleaseHandle メソッド


派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。When overridden in a derived class, executes the code required to free the handle.

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


ハンドルが正常に解放された場合は true。深刻なエラーが発生した場合は falsetrue if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. この場合、releaseHandleFailed マネージド デバッグ アシスタントが生成されます。In this case, it generates a releaseHandleFailed Managed Debugging Assistant.

次のコード例では、ハンドルを解放します。これは SafeHandle クラス用に用意されている大きな例の一部です。The following code example releases the handle and is part of a larger example provided for the SafeHandle class.

[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.


ReleaseHandle メソッドは、IsInvalid プロパティで定義されているとおりにハンドルが有効である場合にのみ、1回だけ呼び出されることが保証されます。The ReleaseHandle method is guaranteed to be called only once and only if the handle is valid as defined by the IsInvalid property. このメソッドを SafeHandle の派生クラスに実装して、ハンドルを解放するために必要なすべてのコードを実行します。Implement this method in your SafeHandle derived classes to execute any code that is required to free the handle. SafeHandle の関数の1つはリソースリークの防止を保証することであるため、ReleaseHandle の実装のコードは失敗しないようにする必要があります。Because one of the functions of SafeHandle is to guarantee prevention of resource leaks, the code in your implementation of ReleaseHandle must never fail. ガベージコレクターは、同時にガベージコレクションされたオブジェクトに対して通常のファイナライザーを実行した後に ReleaseHandle を呼び出します。The garbage collector calls ReleaseHandle after normal finalizers have been run for objects that were garbage collected at the same time. ガベージコレクターは、このメソッドを呼び出すためのリソースを保証し、処理中にメソッドが中断されないようにします。The garbage collector guarantees the resources to invoke this method and that the method will not be interrupted while it is in progress. このメソッドは、インスタンスの構築時に制約された実行領域 (CER) として準備されます (静的な determinable 呼び出しグラフ内のすべてのメソッドと共に)。This method will be prepared as a constrained execution region (CER) at instance construction time (along with all the methods in its statically determinable call graph). これによってスレッド中止割り込みが発生することはありませんが、オーバーライドされた ReleaseHandle メソッドにエラーパスを導入しないように注意する必要があります。Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden ReleaseHandle method. 特に、ReleaseHandleから呼び出すメソッドに ReliabilityContractAttribute 属性を適用します。In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. ほとんどの場合、このコードは次のようになります。In most cases this code should be:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

また、単純なクリーンアップ (たとえば、ファイルハンドルで Windows API CloseHandle を呼び出す) では、単一のプラットフォーム呼び出しの戻り値を確認できます。Additionally, for simple cleanup (for example, calling the Windows API CloseHandle on a file handle) you can check the return value for the single platform invoke call. 複雑なクリーンアップでは、多くのプログラムロジックと多くのメソッド呼び出しがあり、その一部が失敗する可能性があります。For complex cleanup, you may have a lot of program logic and many method calls, some of which might fail. プログラムロジックにそれぞれのケースのフォールバックコードがあることを確認する必要があります。You must ensure that your program logic has fallback code for each of those cases.

何らかの理由で ReleaseHandle false が返された場合、 Releasehandlefailedマネージデバッグアシスタントが生成されます。If ReleaseHandle returns false for any reason, it generates a releaseHandleFailed Managed Debugging Assistant. これは、リソースを解放しようとすると失敗するケースを検出するのに役立ちます。This helps you detect cases where your attempt to release resources fails.


アンマネージコードを呼び出すためのアクセス許可。for permission to call unmanaged code. セキュリティアクション: LinkDemandSecurity action: LinkDemand. 関連付けられた列挙型: UnmanagedCodeAssociated enumeration: UnmanagedCode