SafeHandle.ReleaseHandle SafeHandle.ReleaseHandle SafeHandle.ReleaseHandle SafeHandle.ReleaseHandle Method


派生クラスでオーバーライドされると、ハンドルを解放するために必要なコードを実行します。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プロパティ。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. の関数の 1 つSafeHandle、コードの実装では、リソースのリークの防止を保証するためには、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) として準備されます。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. 具体的には、適用、ReliabilityContractAttributeから呼び出すメソッドが存在する属性ReleaseHandleします。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ファイル ハンドルで) 1 つのプラットフォーム呼び出しの戻り値を確認することができます。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. セキュリティ アクション:LinkDemandします。Security action: LinkDemand. 関連付けられた列挙体。 UnmanagedCodeAssociated enumeration: UnmanagedCode