RuntimeHelpers.PrepareConstrainedRegions Метод

Определение

Внимание!

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

Назначает основную часть кода как область с ограничением исполнения (CER).Designates a body of code as a constrained execution region (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 ();
public static void PrepareConstrainedRegions ();
[System.Security.SecurityCritical]
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
static member PrepareConstrainedRegions : unit -> unit
[<System.Security.SecurityCritical>]
static member PrepareConstrainedRegions : unit -> unit
Public Shared Sub PrepareConstrainedRegions ()
Атрибуты

Примеры

В следующем примере показано, как надежно задать дескрипторы с помощью PrepareConstrainedRegions метода.The following example shows how to reliably set handles by using the PrepareConstrainedRegions method. Для надежной установки маркера на указанный ранее обработчик необходимо убедиться, что выделение собственного и последующей записи этого маркера в SafeHandle объекте является атомарным.To reliably set a handle to a specified pre-existing handle, you must ensure that the allocation of the native handle and the subsequent recording of that handle within a SafeHandle object is atomic. Любой сбой между этими операциями (например, прерывание потока или исключением нехватки памяти) приведет к утечке собственного дескриптора.Any failure between these operations (such as a thread abort or out-of-memory exception) will result in the native handle being leaked. Можно использовать метод, PrepareConstrainedRegions чтобы убедиться в том, что дескриптор не был утечкой.You can use the PrepareConstrainedRegions method to make sure that the handle is not leaked.

[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


Комментарии

Компиляторы используют этот метод для пометки catch finally блоков, и fault в качестве областей ограниченного выполнения (CER).Compilers use this method to mark catch, finally, and fault blocks as constrained execution regions (CERs). Код, помеченный как область ограниченного хранения, должен вызывать только другой код со строгими контрактами надежности.Code that is marked as a constrained region must only call other code with strong reliability contracts. Он не должен распределять или делать виртуальные вызовы для неподготовленных или ненадежных методов, пока не будет подготовлено к обработке сбоев.It should not allocate or make virtual calls to unprepared or unreliable methods unless it is prepared to handle failures.

Обратите внимание, что NOP между вызовом PrepareConstrainedRegions метода и блоком не допускаются коды операций промежуточного языка, за исключением случаев try .Note that no intermediate language opcodes, except NOP, are allowed between a call to the PrepareConstrainedRegions method and the try block. Дополнительные сведения о CER см. в разделе классы в System.Runtime.ConstrainedExecution пространстве имен.For more information about CERs, see the classes in the System.Runtime.ConstrainedExecution namespace.

CER-области, помеченные с помощью PrepareConstrainedRegions метода, не работают идеально при создании StackOverflowException из try блока.CERs that are marked using the PrepareConstrainedRegions method do not work perfectly when a StackOverflowException is generated from the try block. Дополнительные сведения см. в описании метода ExecuteCodeWithGuaranteedCleanup.For more information, see the ExecuteCodeWithGuaranteedCleanup method.

Метод PrepareConstrainedRegions вызывает метод ProbeForSufficientStack.The PrepareConstrainedRegions method calls the ProbeForSufficientStack method.

Применяется к