RuntimeHelpers.PrepareConstrainedRegions Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Upozornění
The Constrained Execution Region (CER) feature is not supported.
Určuje tělo kódu jako oblast omezeného provádění (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 ()
- Atributy
Příklady
Následující příklad ukazuje, jak spolehlivě nastavit popisovače pomocí PrepareConstrainedRegions metody . Chcete-li spolehlivě nastavit popisovač na zadaný předem existující popisovač, musíte zajistit, aby přidělení nativního popisovače a následné zaznamenání tohoto popisovače v objektu SafeHandle byly atomické. Jakékoli selhání mezi těmito operacemi (například přerušení vlákna nebo výjimka kvůli nedostatku paměti) způsobí nevrácení nativního popisovače. Pomocí metody se můžete PrepareConstrainedRegions ujistit, že popisovač neteče.
[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
Poznámky
Kompilátory používají tuto metodu k označení catch
bloků , finally
a fault
jako omezených oblastí provádění (CERs). Kód, který je označen jako omezená oblast, musí volat pouze jiný kód se silnými kontrakty spolehlivosti. Nemělo by přidělovat ani provádět virtuální volání nepřipravených nebo nespolehlivých metod, pokud není připraven na zpracování selhání.
Všimněte si, že mezi voláním metody a bloku nejsou povoleny žádné kódy zprostředkujícího PrepareConstrainedRegionstry
jazyka s výjimkou NOP
. Další informace o CER najdete v třídách System.Runtime.ConstrainedExecution v oboru názvů .
Zprávy o stavu, které jsou označeny metodou PrepareConstrainedRegions , nefungují dokonale, když StackOverflowException je vygenerován z try
bloku. Další informace najdete v ExecuteCodeWithGuaranteedCleanup metodě .
Metoda PrepareConstrainedRegions volá metodu ProbeForSufficientStack .