RuntimeHelpers.PrepareConstrainedRegions Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Внимание!
The Constrained Execution Region (CER) feature is not supported.
Задает текст кода в качестве ограниченного региона выполнения (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 ()
- Атрибуты
Примеры
В следующем примере показано, как надежно задать дескриптор 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и finallyfaultблоков как ограниченные области выполнения (CER). Код, помеченный как ограниченный регион, должен вызывать только другой код с строгими контрактами надежности. Он не должен выделять или выполнять виртуальные вызовы к неподготовленным или ненадежным методам, если он не готов обрабатывать сбои.
Обратите внимание, что между вызовом NOP метода и PrepareConstrainedRegions блоком не допускается никаких промежуточных языковых опкодов.try Дополнительные сведения о ЦС см. в классах в System.Runtime.ConstrainedExecution пространстве имен.
ЦС, помеченные с помощью PrepareConstrainedRegions метода, не работают идеально при StackOverflowException создании try из блока. Дополнительные сведения см. в методе ExecuteCodeWithGuaranteedCleanup.
Метод PrepareConstrainedRegions вызывает ProbeForSufficientStack метод.