RuntimeHelpers.PrepareConstrainedRegions Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Precaución
The Constrained Execution Region (CER) feature is not supported.
Designa un cuerpo de código como una región de ejecución limitada (CER, Constrained Execution Region).
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 ();
public static void PrepareConstrainedRegions ();
[System.Security.SecurityCritical]
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
static member PrepareConstrainedRegions : unit -> unit
[<System.Security.SecurityCritical>]
static member PrepareConstrainedRegions : unit -> unit
Public Shared Sub PrepareConstrainedRegions ()
- Atributos
Ejemplos
En el ejemplo siguiente se muestra cómo establecer identificadores de forma confiable mediante el PrepareConstrainedRegions método . Para establecer de forma confiable un identificador en un identificador preexistente especificado, debe asegurarse de que la asignación del identificador nativo y la grabación subsiguiente de ese identificador dentro de un SafeHandle objeto es atómica. Cualquier error entre estas operaciones (como una anulación de subprocesos o una excepción de memoria fuera de memoria) provocará la pérdida del identificador nativo. Puede usar el método PrepareConstrainedRegions para asegurarse de que el identificador no se pierde.
[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
Comentarios
Los compiladores usan este método para marcar los bloques catch
finally
, y como fault
regiones de ejecución restringidas (CER). El código marcado como una región restringida solo debe llamar a otro código con contratos de confiabilidad sólidos. No debe asignar ni realizar llamadas virtuales a métodos no preparados o no confiables a menos que esté preparado para controlar los errores.
Tenga en cuenta que no se permite ningún código de operación de lenguaje intermedio, excepto , entre una NOP
llamada al método y el bloque PrepareConstrainedRegions try
. Para obtener más información sobre las CER, vea las clases del espacio de System.Runtime.ConstrainedExecution nombres .
Las CER que se marcan mediante PrepareConstrainedRegions el método no funcionan perfectamente cuando se genera un a partir del bloque StackOverflowException try
. Para obtener más información, vea el método ExecuteCodeWithGuaranteedCleanup.
El método PrepareConstrainedRegions llama al método ProbeForSufficientStack.