Condividi tramite


RuntimeHelpers.PrepareConstrainedRegions Metodo

Definizione

Attenzione

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

Indica un corpo di codice come area a esecuzione limitata (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 ()
Attributi

Esempio

Nell'esempio seguente viene illustrato come impostare in modo affidabile handle usando il PrepareConstrainedRegions metodo . Per impostare in modo affidabile un handle su un handle preesistente specificato, è necessario assicurarsi che l'allocazione dell'handle nativo e la registrazione successiva di tale handle all'interno di un SafeHandle oggetto sia atomica. Qualsiasi errore tra queste operazioni , ad esempio un'interruzione del thread o un'eccezione di memoria insufficiente, comporta la perdita di un handle nativo. È possibile usare il metodo per assicurarsi che l'handle PrepareConstrainedRegions non venga rilevato.

[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

Commenti

I compilatori usano questo metodo per contrassegnare catch, finallye fault blocchi come aree di esecuzione vincolate (CER). Il codice contrassegnato come area vincolata deve chiamare solo altro codice con contratti di affidabilità forti. Non deve allocare o effettuare chiamate virtuali a metodi non preparati o non affidabili, a meno che non sia preparato per gestire gli errori.

Si noti che non è consentito alcun codice opcode del linguaggio intermedio, ad eccezione NOPdi , tra una chiamata al metodo e il PrepareConstrainedRegionstry blocco. Per altre informazioni sulle richieste di protezione dei dati, vedere le classi nello System.Runtime.ConstrainedExecution spazio dei nomi.

Le cer contrassegnate usando il PrepareConstrainedRegions metodo non funzionano perfettamente quando viene generato un StackOverflowException oggetto dal try blocco. Per altre informazioni, vedere il metodo ExecuteCodeWithGuaranteedCleanup.

Il metodo PrepareConstrainedRegions chiama il metodo ProbeForSufficientStack.

Si applica a