Partilhar via


virtualCERCall MDA

O virtualCERCall Assistente de depuração gerenciada (MDA) está ativado como um aviso indicando que gráfico de chamada de um site de chamada dentro de uma região de execução restrita (CER) se refere a um destino virtual, ou seja, uma chamada virtual para um método virtual de não-final ou uma chamada usando uma interface. O common language runtime (CLR) não pode prever o método de destino dessas chamadas da intermediate language e metadados análise de sozinha. Como resultado, a árvore de chamada não pode ser preparado como parte do gráfico CER e anulações de thread na subárvore de que não podem ser bloqueadas automaticamente. Este MDA avisa sobre casos onde uma CER talvez precise ser estendido por meio de chamadas explícitas para o PrepareMethod método uma vez que as informações adicionais necessárias para computar o destino da chamada são conhecidas no tempo de execução.

Sintomas

CERs não são executados quando um thread for anulado ou um domínio de aplicativo é descarregado.

Causa

CER contém uma chamada para um método virtual, não pode ser preparado automaticamente.

Resolução

Chame PrepareMethod para o método virtual.

Efeito sobre o tempo de execução.

Este MDA não tem efeito sobre o CLR.

Saída

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"

Configuração

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

Exemplo

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();
    }
}

Consulte também

Referência

MarshalAsAttribute

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada

Interop Marshaling