Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una región de ejecución restringida (CER) forma parte de un mecanismo para crear código administrado confiable. Una CER define un área en la que el Entorno de Ejecución en Lenguaje Común (CLR) está restringido para evitar excepciones fuera de control que impedirían la ejecución completa del código en el área. Dentro de esa región, el código de usuario no puede ejecutar código que pueda producir excepciones fuera de banda. El método PrepareConstrainedRegions debe preceder inmediatamente a un bloque try
y marca los bloques catch
, finally
, y fault
como regiones de ejecución restringidas. Una vez marcada como región restringida, el código solo debe llamar a otro código con contratos de confiabilidad seguros y el código no debe asignar ni realizar llamadas virtuales a métodos no preparados o no confiables a menos que el código esté preparado para controlar los errores. CLR retrasa las anulaciones de subprocesos del código que se está ejecutando en una CER.
Importante
CER solo se admite en .NET Framework. Este artículo no se aplica a .NET Core ni a .NET 5 ni a versiones posteriores.
Las regiones de ejecución restringida se usan en diferentes formas en el CLR además de un bloque anotado try
, en particular los finalizadores críticos que se ejecutan en clases derivadas de la clase CriticalFinalizerObject y el código ejecutado mediante el método ExecuteCodeWithGuaranteedCleanup.
Preparación anticipada de CER
El CLR prepara los CER con anticipación para evitar situaciones de falta de memoria. La preparación anticipada es necesaria para que CLR no provoque una situación de memoria insuficiente durante la compilación Just-In-Time o la carga de tipos.
Se requiere que el desarrollador indique que una región de código es un CER.
La región de CER de nivel superior y los métodos del gráfico de llamadas completo que tienen aplicado el ReliabilityContractAttribute atributo se preparan de antemano. Solo ReliabilityContractAttribute puede declarar las garantías de Success o MayFail.
No se puede realizar la preparación anticipada para las llamadas que no se pueden determinar estáticamente, como el envío virtual. Use el PrepareMethod método en estos casos. Al usar el ExecuteCodeWithGuaranteedCleanup método , el PrePrepareMethodAttribute atributo se debe aplicar al código de limpieza.
Restricciones
Los usuarios están restringidos en el tipo de código que pueden escribir en un CER. El código no puede provocar una excepción fuera de banda, como puede resultar de las siguientes operaciones:
Asignación explícita.
Boxeo.
Adquisición de un bloqueo.
Llamada a métodos no preparados de forma virtual.
Llamada a métodos con un contrato de fiabilidad débil o inexistente.
En .NET Framework versión 2.0, estas restricciones son directrices. Los diagnósticos se proporcionan a través de herramientas de análisis de código.
Contratos de confiabilidad
ReliabilityContractAttribute es un atributo personalizado que documenta las garantías de confiabilidad y el estado de corrupción de un método determinado.
Garantías de confiabilidad
Las garantías de confiabilidad, representadas por Cer valores de enumeración, indican el grado de confiabilidad de un método determinado:
MayFail. En condiciones excepcionales, es posible que se produzca un error en el método. En este caso, el método informa al método que realiza la llamada tanto si se realizó correctamente como si se produjo un error. El método debe estar contenido en un CER para asegurarse de que puede notificar el valor devuelto.
None. El método, tipo o ensamblado no tiene ningún concepto de una CER y lo más probable es que no sea seguro llamar desde dentro de una CER sin mitigación significativa de daños de estado. No aprovecha las garantías CER. Esto implica lo siguiente:
En condiciones excepcionales, el método podría producir un error.
El método podría notificar o no que se produjo un error.
El método no está diseñado para usar una CER, el escenario más probable.
Si un método, tipo o ensamblado no se identifica explícitamente para tener éxito, se identifica implícitamente como None.
Success. En condiciones excepcionales, se garantiza que el método tenga éxito. Para lograr este nivel de confiabilidad, siempre debe construir un CER en torno al método que se invoca, incluso cuando se invoca desde dentro de una región no CER. Un método es correcto si logra lo que se pretende, aunque el éxito se puede ver subjetivamente. Por ejemplo, marcar Count con
ReliabilityContractAttribute(Cer.Success)
implica que cuando se ejecuta en un CER, siempre devuelve un recuento del número de elementos en ArrayList y nunca puede dejar los campos internos en un estado no predeterminado. Pero el método CompareExchange también está marcado como correcto, con la asunción de que correcto puede significar que el valor no se ha podido reemplazar por un nuevo valor a causa de una condición de carrera. El punto clave es que el método se comporta de la manera en que se documenta para comportarse, y no es necesario escribir código CER para esperar un comportamiento inusual más allá del aspecto correcto pero no confiable del código.
Niveles de corrupción
Los niveles de corrupción, representados por Consistency valores de enumeración, indican cuánto estado puede estar corrupto en un entorno determinado.
MayCorruptAppDomain. En condiciones excepcionales, Common Language Runtime (CLR) no garantiza la coherencia del estado en el dominio de aplicación actual.
MayCorruptInstance. En condiciones excepcionales, se garantiza que el método limita los daños de estado a la instancia actual.
MayCorruptProcess, En condiciones excepcionales, el CLR no garantiza la coherencia del estado del sistema; es decir, la condición podría dañar el proceso.
WillNotCorruptState. En condiciones excepcionales, se garantiza que el método no corrompe el estado.
try/catch/finally de fiabilidad
La confiabilidad try/catch/finally
es un mecanismo de control de excepciones con el mismo nivel de garantías de previsibilidad que la versión no administrada. El bloque catch/finally
es la CER. Los métodos del bloque requieren preparación anticipada y deben ser ininterrumpibles.
En la versión 2.0 de .NET Framework, el código informa al tiempo de ejecución de que un elemento try es de confianza mediante una llamada al elemento PrepareConstrainedRegions inmediatamente anterior a un bloque try. PrepareConstrainedRegions es miembro de RuntimeHelpers, una clase de compatibilidad del compilador. Llame a PrepareConstrainedRegions directamente pendiente de disponibilidad mediante compiladores.
Regiones no ininterrumpidas
Una región no ininterrumpida agrupa un conjunto de instrucciones en un CER.
En .NET Framework versión 2.0, pendiente de disponibilidad mediante compatibilidad del compilador, el código de usuario crea regiones no interrumpibles con un elemento try/catch/finally de confianza que contiene un bloque try/catch vacío precedido por una llamada al método PrepareConstrainedRegions.
Objeto finalizador crítico
Un elemento CriticalFinalizerObject garantiza que la recolección de elementos no utilizados va a ejecutar el finalizador. Tras la asignación, el finalizador y su gráfico de llamadas se preparan de antemano. El método finalizador se ejecuta en una CER y debe obedecer todas las restricciones de las CER y los finalizadores.
Se garantiza que el finalizador de todos los tipos que heredan de SafeHandle y CriticalHandle se ejecuta dentro de una CER. Implemente ReleaseHandle en clases derivadas SafeHandle para ejecutar cualquier código necesario para liberar el controlador.
Código no permitido en las CER
Las siguientes operaciones no se permiten en las CER:
Asignaciones explícitas.
Adquisición de un bloqueo.
Boxeo.
Acceso a una matriz multidimensional.
Llamadas a métodos mediante reflexión.
Comprobaciones de seguridad. No se realizan peticiones, solo peticiones de vínculos.
Obtención o establecimiento de campos en un servidor proxy transparente.
Serialización.
Punteros de función y delegados.