RuntimeHelpers.PrepareConstrainedRegions Metodo

Definizione

Definisce un corpo di codice come area di esecuzione vincolata .

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 ()
Attributi

Esempio

Nell'esempio seguente viene illustrato come impostare in modo affidabile gli 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 successiva registrazione 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, comporterà la perdita dell'handle nativo. È possibile utilizzare il PrepareConstrainedRegions metodo per assicurarsi che l'handle non venga trapelato.

[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 catchi blocchi , finallye fault come aree di esecuzione vincolate . Il codice contrassegnato come area vincolata deve chiamare solo altro codice con contratti di affidabilità avanzata. Non deve allocare o effettuare chiamate virtuali a metodi non preparati o non affidabili, a meno che non sia disposto a gestire gli errori.

Si noti che non sono consentiti codici operativo intermedi del linguaggio, ad eccezione NOPdi , tra una chiamata al PrepareConstrainedRegions metodo e il try blocco . Per altre informazioni sulle richieste pull, vedere le classi nello spazio dei System.Runtime.ConstrainedExecution nomi .

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

Il PrepareConstrainedRegions metodo chiama il ProbeForSufficientStack metodo .

Si applica a