RuntimeHelpers.PrepareConstrainedRegions Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Attenzione
The Constrained Execution Region (CER) feature is not supported.
Indica un corpo di codice come area a esecuzione limitata (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 ()
- Attributi
Esempio
Nell'esempio seguente viene illustrato come impostare in modo affidabile 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 registrazione successiva 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, comporta la perdita di un handle nativo. È possibile usare il metodo per assicurarsi che l'handle PrepareConstrainedRegions non venga rilevato.
[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 catch
, finally
e fault
blocchi come aree di esecuzione vincolate (CER). Il codice contrassegnato come area vincolata deve chiamare solo altro codice con contratti di affidabilità forti. Non deve allocare o effettuare chiamate virtuali a metodi non preparati o non affidabili, a meno che non sia preparato per gestire gli errori.
Si noti che non è consentito alcun codice opcode del linguaggio intermedio, ad eccezione NOP
di , tra una chiamata al metodo e il PrepareConstrainedRegionstry
blocco. Per altre informazioni sulle richieste di protezione dei dati, vedere le classi nello System.Runtime.ConstrainedExecution spazio dei nomi.
Le cer contrassegnate usando il PrepareConstrainedRegions metodo non funzionano perfettamente quando viene generato un StackOverflowException oggetto dal try
blocco. Per altre informazioni, vedere il metodo ExecuteCodeWithGuaranteedCleanup.
Il metodo PrepareConstrainedRegions chiama il metodo ProbeForSufficientStack.