RuntimeHelpers.PrepareConstrainedRegions Methode

Definition

Legt einen Codetext als eingeschränkten Ausführungsbereich (CER) fest.

public:
 static void PrepareConstrainedRegions();
public static void PrepareConstrainedRegions();
[System.Security.SecurityCritical]
public static void PrepareConstrainedRegions();
static member PrepareConstrainedRegions : unit -> unit
[<System.Security.SecurityCritical>]
static member PrepareConstrainedRegions : unit -> unit
Public Shared Sub PrepareConstrainedRegions ()
Attribute

Beispiele

Das folgende Beispiel zeigt, wie mithilfe der PrepareConstrainedRegions-Methode Handles zuverlässig festgelegt werden. Um einen Handle zuverlässig auf einen angegebenen bereits vorhandenen Handle festzulegen, müssen Sie sicherstellen, dass die Zuordnung des systemeigenen Handles und die nachfolgende Aufzeichnung dieses Handles innerhalb eines SafeHandle Objekts atomisch ist. Alle Fehler zwischen diesen Vorgängen (z. B. einer Threadabbruch- oder Out-of-Memory-Ausnahme) führen dazu, dass das systemeigene Handle verloren geht. Sie können die PrepareConstrainedRegions-Methode verwenden, um sicherzustellen, dass der Handle nicht verloren geht.

[StructLayout(LayoutKind.Sequential)]
struct MyStruct
{
    public IntPtr m_outputHandle;
}

sealed class MySafeHandle : SafeHandle
{
    // Called by P/Invoke when returning SafeHandles
    public MySafeHandle()
        : base(IntPtr.Zero, true)
    {
    }

    public MySafeHandle AllocateHandle()
    {
        // Allocate SafeHandle first to avoid failure later.
        MySafeHandle sh = new MySafeHandle();

        RuntimeHelpers.PrepareConstrainedRegions();
        try { }
        finally
        {
            MyStruct myStruct = new MyStruct();
            NativeAllocateHandle(ref myStruct);
            sh.SetHandle(myStruct.m_outputHandle);
        }

        return sh;
    }
<StructLayout(LayoutKind.Sequential)> _
Structure MyStruct
    Public m_outputHandle As IntPtr
End Structure 'MyStruct


NotInheritable Class MySafeHandle
    Inherits SafeHandle

    ' Called by P/Invoke when returning SafeHandles
    Public Sub New()
        MyBase.New(IntPtr.Zero, True)

    End Sub


    Public Function AllocateHandle() As MySafeHandle
        ' Allocate SafeHandle first to avoid failure later.
        Dim sh As New MySafeHandle()

        RuntimeHelpers.PrepareConstrainedRegions()
        Try
        Finally
            Dim myStruct As New MyStruct()
            NativeAllocateHandle(myStruct)
            sh.SetHandle(myStruct.m_outputHandle)
        End Try

        Return sh

    End Function

Hinweise

Compiler verwenden diese Methode, um Blöcke als eingeschränkte Ausführungsbereiche (CERs) zu markierencatchfinally, und fault Blöcke. Code, der als eingeschränkter Bereich gekennzeichnet ist, darf nur anderen Code mit starken Zuverlässigkeitsverträgen aufrufen. Es sollte keine virtuellen Aufrufe an nicht analysierte oder unzuverlässige Methoden zuweisen oder tätigen, es sei denn, sie ist bereit, Fehler zu behandeln.

Beachten Sie, dass zwischen einem Aufruf der PrepareConstrainedRegions Methode und dem try Block keine Opcodes der Zwischensprache zulässig sind.NOP Weitere Informationen zu CERs finden Sie in den Klassen im System.Runtime.ConstrainedExecution Namespace.

CERs, die mit der PrepareConstrainedRegions Methode gekennzeichnet sind, funktionieren nicht perfekt, wenn ein StackOverflowException Aus dem try Block generiert wird. Weitere Informationen finden Sie in der ExecuteCodeWithGuaranteedCleanup Methode.

Die PrepareConstrainedRegions Methode ruft die ProbeForSufficientStack Methode auf.

Gilt für: