Compartir a través de


MDA de illegalPrepareConstrainedRegion

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El Asistente para la depuración administrada (MDA) illegalPrepareConstrainedRegion se activa cuando una llamada al método RuntimeHelpers.PrepareConstrainedRegions no precede inmediatamente a la instrucción try del controlador de excepciones. Esta restricción está en el nivel de MSIL, por lo que permite tener un origen de no generación de código entre la llamada y try (por ejemplo comentarios).

Síntomas

Una región de ejecución restringida (CER) que nunca se trata como tal, sino como un simple bloque de control de excepciones (finally o catch). En consecuencia, la región no se ejecuta en el caso de una condición de memoria insuficiente o una anulación del subproceso.

Causa

El modelo de preparación para una región CER no se ha seguido correctamente. Se trata de un evento de error. La llamada de método PrepareConstrainedRegions que se usó para marcar que los controladores de excepciones introducían una región CER en los bloques catch/finally/fault/filter debe usarse inmediatamente antes de la instrucción try.

Solución

Asegúrese de que la llamada a PrepareConstrainedRegions se produce inmediatamente antes de la instrucción try.

Efecto en el Runtime

Este MDA no tiene ningún efecto en el CLR.

Output

El MDA muestra el nombre del método que llama al método PrepareConstrainedRegions, el desplazamiento MSIL y un mensaje que indica que la llamada no precede inmediatamente al inicio del bloque try.

Configuración

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion/>
  </assistants>
</mdaConfig>

Ejemplo

En el ejemplo de código siguiente se muestra el patrón que hace que se active este MDA.

void MethodWithInvalidPCR()
{
    RuntimeHelpers.PrepareConstrainedRegions();
    Object o = new Object();
    try
    {
        …
    }
    finally
    {
        …
    }
}

Consulte también