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.
Definisce un corpo di codice come area di esecuzione vincolata .
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 ()
- Attributi
Esempio
Nell'esempio seguente viene illustrato come impostare in modo affidabile gli 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 successiva registrazione 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, comporterà la perdita dell'handle nativo. È possibile utilizzare il PrepareConstrainedRegions metodo per assicurarsi che l'handle non venga trapelato.
[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 catchi blocchi , finallye fault come aree di esecuzione vincolate . Il codice contrassegnato come area vincolata deve chiamare solo altro codice con contratti di affidabilità avanzata. Non deve allocare o effettuare chiamate virtuali a metodi non preparati o non affidabili, a meno che non sia disposto a gestire gli errori.
Si noti che non sono consentiti codici operativo intermedi del linguaggio, ad eccezione NOPdi , tra una chiamata al PrepareConstrainedRegions metodo e il try blocco . Per altre informazioni sulle richieste pull, vedere le classi nello spazio dei System.Runtime.ConstrainedExecution nomi .
Le richieste di archiviazione contrassegnate con il PrepareConstrainedRegions metodo non funzionano perfettamente quando un StackOverflowException oggetto viene generato dal try blocco. Per altre informazioni, vedere il metodo ExecuteCodeWithGuaranteedCleanup.
Il PrepareConstrainedRegions metodo chiama il ProbeForSufficientStack metodo .