Sdílet prostřednictvím


RuntimeHelpers.PrepareConstrainedRegions Metoda

Definice

Upozornění

The Constrained Execution Region (CER) feature is not supported.

Určuje tělo kódu jako oblast omezeného provádění (CER).

public:
 static void PrepareConstrainedRegions();
[System.Obsolete("The Constrained Execution Region (CER) feature is not supported.", DiagnosticId="SYSLIB0004", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public static void PrepareConstrainedRegions ();
[System.Security.SecurityCritical]
public static void PrepareConstrainedRegions ();
public static void PrepareConstrainedRegions ();
[<System.Obsolete("The Constrained Execution Region (CER) feature is not supported.", DiagnosticId="SYSLIB0004", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
static member PrepareConstrainedRegions : unit -> unit
[<System.Security.SecurityCritical>]
static member PrepareConstrainedRegions : unit -> unit
static member PrepareConstrainedRegions : unit -> unit
Public Shared Sub PrepareConstrainedRegions ()
Atributy

Příklady

Následující příklad ukazuje, jak spolehlivě nastavit popisovače pomocí PrepareConstrainedRegions metody . Chcete-li spolehlivě nastavit popisovač na zadaný předem existující popisovač, musíte zajistit, aby přidělení nativního popisovače a následné zaznamenání tohoto popisovače v objektu SafeHandle byly atomické. Jakékoli selhání mezi těmito operacemi (například přerušení vlákna nebo výjimka kvůli nedostatku paměti) způsobí nevrácení nativního popisovače. Pomocí metody se můžete PrepareConstrainedRegions ujistit, že popisovač neteče.

[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

Poznámky

Kompilátory používají tuto metodu k označení catchbloků , finallya fault jako omezených oblastí provádění (CERs). Kód, který je označen jako omezená oblast, musí volat pouze jiný kód se silnými kontrakty spolehlivosti. Nemělo by přidělovat ani provádět virtuální volání nepřipravených nebo nespolehlivých metod, pokud není připraven na zpracování selhání.

Všimněte si, že mezi voláním metody a bloku nejsou povoleny žádné kódy zprostředkujícího PrepareConstrainedRegionstry jazyka s výjimkou NOP. Další informace o CER najdete v třídách System.Runtime.ConstrainedExecution v oboru názvů .

Zprávy o stavu, které jsou označeny metodou PrepareConstrainedRegions , nefungují dokonale, když StackOverflowException je vygenerován z try bloku. Další informace najdete v ExecuteCodeWithGuaranteedCleanup metodě .

Metoda PrepareConstrainedRegions volá metodu ProbeForSufficientStack .

Platí pro