Compartir a través de


regiones de ejecución restringidas

Un área de ejecución restringida (CER) forma parte de un mecanismo para crear código administrado confiable. Una CER define un área en la que Common Language Runtime (CLR) tiene restringida la producción de excepciones fuera de banda que impedirían que el código contenido en el área se ejecutara por completo. Dentro de esa área, el código de usuario tiene restringida la ejecución del código que provocaría la producción de excepciones fuera de banda. El método PrepareConstrainedRegions debe ir colocado inmediatamente antes un bloque try y marca los bloques catch, finally y fault como áreas de ejecución restringida. Una vez marcado como área restringida, el código sólo debe llamar a otro código con contratos de alta confiabilidad y el código no debería asignar ni realizar llamadas virtuales a métodos sin preparar o no confiables a menos que el código esté preparado para controlar errores. La CLR retrasa las anulaciones del subproceso para el código que se está ejecutando en una CER.

Las áreas de ejecución restringida se utilizan de diferentes formas en la CLR además de un bloque try anotado, principalmente los finalizadores críticos que se están ejecutando en clases derivadas de la clase CriticalFinalizerObject y el código ejecutado usando el método ExecuteCodeWithGuaranteedCleanup.

Preparación adelantada de las CER

Common Language Runtime prepara de antemano las CER para evitar condiciones de falta de memoria. La preparación adelantada es necesaria para que Common Language Runtime no cause una condición de falta de memoria durante la compilación Just-In-Time o la carga de tipos.

El desarrollador debe indicar que un área de código es una CER:

Restricciones

Los usuarios tienen restricciones en cuanto al tipo de código que pueden escribir en una CER. El código no puede producir una excepción fuera de banda, como podría ser el resultado de las operaciones siguientes:

  • Asignación explícita.

  • Conversión boxing.

  • Adquirir un bloqueo.

  • Llamar virtualmente a métodos no preparados.

  • Llamar a métodos con un contrato de confiabilidad débil o inexistente.

En la versión 2.0 de .NET Framework, estas restricciones son instrucciones. Los diagnósticos se proporcionan mediante 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 daños de un método determinado.

Garantías de confiabilidad

Las garantías de confiabilidad, representadas por valores de enumeración Cer, indican el grado de confiabilidad de un método determinado:

  • MayFail. En condiciones excepcionales, se podría producir un error en el método. En este caso, el método devuelve información al método de llamada sobre si se realizó correctamente o no. El método debe estar contenido en una CER para garantizar que puede informar del valor devuelto.

  • None. El método, tipo o ensamblado no tienen conocimiento de lo que es una CER y es muy probable que no sea seguro llamarlo desde dentro de una CER sin una mitigación significativa del estado dañado. No aprovecha las garantías de las áreas CER. Esto implica lo siguiente:

    1. En condiciones excepcionales, se podría producir un error en el método.

    2. El método podría o no informar de que se produjo un error.

    3. El método no está escrito para utilizar un área CER, el escenario más probable.

    4. Si un método, tipo, o el ensamblado no está identificado explícitamente como de resultado correcto, se identifica implícitamente como None.

  • Success. En condiciones excepcionales, el método tiene garantía de finalizar correctamente. Para conseguir este nivel de confiabilidad, siempre debería construir un área CER alrededor del método llamado, incluso cuando se lo llame desde un área que no sea CER. Un método finaliza correctamente si consigue lo que se esperaba del mismo, aunque la corrección puede ser subjetiva. Por ejemplo, marcar el contador Count con ReliabilityContractAttribute(Cer.Success) implica que, cuando se ejecuta dentro de un área CER, siempre devuelve un recuento del número de elementos incluidos en la ArrayList y que nunca puede dejar los campos internos en estado indeterminado. Sin embargo, el método CompareExchange está marcado también como correcto, con la comprensión de que el estado de correcto podría significar que el valor no se pudo reemplazar con un nuevo valor a causa de una condición de carrera. El punto principal es que el comportamiento del método es como el que está documentado y no es necesario escribir código de CER para que espere ningún comportamiento inusual aparte del que podría tener el código correcto pero no confiable.

Niveles de daños

Los niveles de daño, representados por valores de enumeración Consistency, indican hasta qué nivel podría estar dañado en un entorno determinado:

  • MayCorruptAppDomain. En condiciones excepcionales, Common Language Runtime (CLR) no proporciona ninguna garantía relativa a la coherencia del estado en el dominio de aplicación actual.

  • MayCorruptInstance. En condiciones excepcionales, el método tiene garantía de un daño de estado limitado a la instancia actual.

  • MayCorruptProcess, en condiciones excepcionales, CLR no supone ninguna garantía relativa a la coherencia del estado; es decir, la condición podría dañar el proceso.

  • WillNotCorruptState. Bajo condiciones excepcionales, hay garantía de que el método no daña el estado.

Confiabilidad de try/catch/finally

try/catch/finally es un mecanismo del control de excepciones con el mismo nivel de garantías de previsibilidad que el de las versiones no administradas. El bloque catch/finally es el área CER. Los métodos incluidos en el bloque requieren la preparación de antemano y deben ser no interrumpibles.

En la versión 2.0 de .NET Framework, el código informa al motor en tiempo de ejecución de que una instrucción try es confiable llamando a PrepareConstrainedRegions inmediatamente anterior a un bloque try. PrepareConstrainedRegions es miembro de RuntimeHelpers, una clase de soporte de compilador. Llame a PrepareConstrainedRegions directamente dependiendo de su disponibilidad mediante compiladores.

Áreas no interrumpibles

Un área no interrumpible agrupa un conjunto de instrucciones en una CER.

En la versión 2.0 de .NET Framework, con dependencia de la disponibilidad mediante compatibilidad del compilador, el código de usuario crea áreas ininterrumpibles con una estructura try/catch/finally confiable que contiene un bloque try/catch vacío precedido de una llamada de método PrepareConstrainedRegions.

Objeto finalizador crítico

Un objeto CriticalFinalizerObject garantiza que la recolección de elementos no utilizados ejecutará el finalizador. Tras la asignación, se preparan de antemano el finalizador y su gráfico de llamadas. El método finalizador se ejecuta en una CER y debe obedecer todas las restricciones de las CER y los finalizadores.

Los tipos que heredan de SafeHandle y CriticalHandle tienen la garantía de que su finalizador se ejecuta dentro de una CER. Implemente ReleaseHandle en clases derivadas SafeHandle para ejecutar cualquier código necesario para liberar el identificador.

Código no permitido en las CER

Dentro de las CER no están permitidas las operaciones siguientes:

  • Asignaciones explícitas.

  • Adquirir un bloqueo.

  • Conversiones boxing.

  • Acceso a matriz multidimensional.

  • Llamadas métodos a través de reflexión.

  • Enter o Lock

  • Comprobaciones de seguridad. No se realizan peticiones, sólo peticiones de vínculo.

  • Isinst y Castclass para los objetos COM y servidores proxy.

  • Obtener o establecer campos de un servidor proxy transparente.

  • Serialización.

  • Punteros de función y delegados.

Vea también

Conceptos

Procedimientos recomendados para la confiabilidad