![]()
true if the handle is released successfully; otherwise, in the event of a catastrophic failure, false. In this case, it generates a ReleaseHandleFailed Managed Debugging Assistant.
The SafeHandle.ReleaseHandle method is guaranteed to be called only once and only if the handle is valid as defined by the SafeHandle.IsInvalid property. Implement this method in your System.Runtime.InteropServices.SafeHandle derived classes to execute any code that is required to free the handle. Because one of the functions of System.Runtime.InteropServices.SafeHandle is to guarantee prevention of resource leaks, the code in your implementation of SafeHandle.ReleaseHandle must never fail. The garbage collector calls SafeHandle.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. 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). Although this prevents thread abort interrupts, you must still be careful not to introduce any fault paths in your overridden SafeHandle.ReleaseHandle method. In particular, apply the System.Runtime.ConstrainedExecution.ReliabilityContractAttribute attribute to any methods you call from SafeHandle.ReleaseHandle. In most cases this code should be:
ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)
Additionally, for simple cleanup (for example, calling the Win32 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.
If SafeHandle.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.