MDA de virtualCERCall

Actualización: noviembre 2007

El asistente para la depuración administrada (MDA) virtualCERCall se activa como una advertencia que indica que un sitio de llamada situado dentro de un gráfico de llamada de un área de ejecución restringida (CER) hace referencia a un destino virtual, es decir, una llamada virtual a un método virtual no final o una llamada utilizando una interfaz. Common Language Runtime (CLR) no puede predecir el método de destino de estas llamadas exclusivamente a partir del lenguaje intermedio y el análisis de los metadatos. Como resultado, el árbol de llamadas no se puede preparar como parte del gráfico CER y las anulaciones de subprocesos de ese subárbol no se pueden bloquear automáticamente. Este MDA advierte de los casos en los que podría ser necesario ampliar una CER mediante llamadas explícitas al método PrepareMethod una vez que se conoce en tiempo de ejecución la información adicional necesaria para calcular el destino de la llamada.

Síntomas

Áreas CER que no se ejecutan cuando se anula un subproceso o se descarga un dominio de aplicación.

Motivo

Una CER contiene una llamada a un método virtual que no se puede preparar automáticamente.

Resolución

Llame a PrepareMethod para el método virtual.

Efecto en el tiempo de ejecución

Este MDA no tiene ningún efecto en CLR.

Resultados

Method 'MethodWithCer', while executing within a constrained execution region, makes a call
at IL offset 0x0024 to 'VirtualMethod', which is virtual and cannot be prepared automatically
at compile time. The caller must ensure this method is prepared explicitly at
runtime before entering the constrained execution region.
method name="VirtualMethod"
declaringType name="VirtualCERCall+MyClass"
  declaringModule name="mda"
    callsite name="MethodWithCer" offset="0x0024"

Configuración

<mdaConfig>
  <assistants>
    < VirtualCERCall />
  </assistants>
</mdaConfig>

Ejemplo

class MyClass
{
    [ReliabilityContract(Consistency.MayCorruptProcess, CER.None)]
    virtual void VirtualMethod()
    {
        ...
    }
}

class MyDerivedClass : MyClass
{
    [ReliabilityContract(Consistency.MayCorruptProcess, CER.None)]
    override void VirtualMethod()
    {
        ...
    }
}

void MethodWithCer(MyClass object)
{
    RuntimeHelpers.PrepareConstrainedRegions();
    try
    {
        ...
    }
    finally
    {
        // Start of the CER.

        // Cannot tell at analysis time whether object is a MyClass
        // or a MyDerivedClass, so we do not know which version of 
        // VirtualMethod we are going to call.
        object.VirtualMethod();
    }
}

Vea también

Conceptos

Diagnóstico de errores con ayudantes de depuraciones administradas

Información general acerca del cálculo de referencia de interoperabilidad

Referencia

MarshalAsAttribute