RuntimeHelpers.PrepareConstrainedRegions Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Задает текст кода в качестве ограниченного региона выполнения (CER).
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 ()
- Атрибуты
Примеры
В следующем примере показано, как надежно задать дескриптор PrepareConstrainedRegions с помощью метода. Чтобы надежно задать дескриптор заданному предварительно существующему дескриптору, необходимо убедиться, что выделение собственного дескриптора и последующее запись этого дескриптора в SafeHandle объекте является атомарным. Любой сбой между этими операциями (например, исключение прерывания потока или исключения из памяти) приведет к утечке собственного дескриптора. Этот метод можно использовать, чтобы убедиться, что дескриптор PrepareConstrainedRegions не утечки.
[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и faultfinallyблоков как ограниченные области выполнения (CER). Код, помеченный как ограниченный регион, должен вызывать только другой код с строгими контрактами надежности. Он не должен выделять или выполнять виртуальные вызовы к неподготовленным или ненадежным методам, если он не готов обрабатывать сбои.
Обратите внимание, что между вызовом PrepareConstrainedRegions метода и try блоком не допускается никаких промежуточных языковых опкодов.NOP Дополнительные сведения о ЦС см. в классах в System.Runtime.ConstrainedExecution пространстве имен.
ЦС, помеченные с помощью PrepareConstrainedRegions метода, не работают идеально при StackOverflowException создании try из блока. Дополнительные сведения см. в методе ExecuteCodeWithGuaranteedCleanup.
Метод PrepareConstrainedRegions вызывает ProbeForSufficientStack метод.