Freigeben über


SafeHandle.ReleaseHandle-Methode: ()

 

Veröffentlicht: Oktober 2016

Führt beim Überschreiben in einer abgeleiteten Klasse den Code aus, der für das Freigeben des Handles erforderlich ist.

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)

Syntax

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

Rückgabewert

Type: System.Boolean

true, wenn das Handle erfolgreich freigegeben wurde, andernfalls im Fall eines schwerwiegenden Fehlers false. In diesem Fall wird ein releaseHandleFailed MDA-Assistent für verwaltetes Debuggen generiert.

Hinweise

Die ReleaseHandle Methode garantiert aufgerufen werden, nur einmal und nur dann, wenn das Handle gültig gemäß der IsInvalid Eigenschaft. Implementieren Sie diese Methode in Ihrer SafeHandle abgeleiteten Klassen, um Code auszuführen, der für das Freigeben des Handles erforderlich ist. Da eine der Funktionen von SafeHandle besteht darin, Vermeidung von Ressourcenverlusten, den Code in der Implementierung der ReleaseHandle darf nie fehlschlagen. Der Garbage Collector ruft ReleaseHandlenachdem normale Finalizer für Objekte ausgeführt wurden, die Garbage collection gleichzeitig waren. Der Garbage Collector garantiert die Ressourcen, um diese Methode aufzurufen, und ausgeführt wird, dass die Methode wird nicht unterbrochen wird. Diese Methode wird zur Entwurfszeit (zusammen mit allen Methoden in der statisch bestimmbare Aufrufdiagramm) Instanz als einen eingeschränkten Ausführungsbereich (CER) vorbereitet werden. Dies verhindert, dass ein Thread Abort Interrupts, Sie weiterhin muss allerdings darauf achten, dass keine Fehler Pfade in der überschriebenen einführen ReleaseHandle Methode. Wenden Sie insbesondere das ReliabilityContractAttribute -Attribut auf alle Methoden, die Sie von Aufrufen ReleaseHandle. In den meisten Fällen sollte dieser Code:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Darüber hinaus für eine einfache Bereinigung (z. B. durch Aufruf der Win32-API- CloseHandle für ein Dateihandle) können Sie den Rückgabewert für den einzelnen Plattformaufruf überprüfen. Bei einer komplexen Bereinigung müssen Sie möglicherweise einen Großteil der Programmlogik und viele Methodenaufrufe, von die einige möglicherweise fehlschlagen. Sie müssen sicherstellen, dass die Programmlogik für jeden dieser Fälle fallback Code verfügt.

Wenn ReleaseHandle gibt false aus irgendeinem Grund, generiert es ein releaseHandleFailed MDA -Assistent für verwaltetes Debuggen. Dadurch können Sie die Fälle zu erkennen, wo die Ressourcen freigeben, fehlschlägt.

Beispiele

Im folgenden Codebeispiel wird das Handle freigegeben und ist Teil eines umfangreicheren Beispiels für die SafeHandle Klasse.

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

Sicherheit

SecurityPermission

for permission to call unmanaged code. Security action: F:System.Security.Permissions.SecurityAction.LinkDemand. Associated enumeration: F:System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode

Versionsinformationen

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 2.0
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1

Siehe auch

SafeHandle-Klasse
System.Runtime.InteropServices-Namespace
Diagnosing Errors with Managed Debugging Assistants
releaseHandleFailed MDA

Zurück zum Anfang