MDA de virtualCERCall
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 efecto en el CLR.
Output
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
Referencia
Conceptos
Diagnóstico de errores con ayudantes de depuraciones administradas