Condividi tramite


virtualCERCall MDA

Annotazioni

Questo articolo è specifico di .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.

L'assistente virtualCERCall al debug gestito viene attivato come avviso che indica che un sito di chiamata all'interno di un grafo di chiamata dell'area di esecuzione vincolata fa riferimento a una destinazione virtuale, ovvero a una chiamata virtuale a un metodo virtuale non finale o a una chiamata tramite un'interfaccia. Common Language Runtime (CLR) non può prevedere il metodo di destinazione di queste chiamate solo dal linguaggio intermedio e dall'analisi dei metadati. Di conseguenza, l'albero delle chiamate non può essere preparato come parte del grafico CER e gli interruzioni del thread in tale sottoalbero non possono essere bloccati automaticamente. Questo assistente al debug PrepareMethod gestito avvisa i casi in cui potrebbe essere necessario estendere un cer usando chiamate esplicite al metodo dopo che le informazioni aggiuntive necessarie per calcolare la destinazione della chiamata sono note in fase di esecuzione.

Sintomi

CeR che non vengono eseguite quando un thread viene interrotto o quando viene scaricato un dominio applicazione.

Motivo

Un cer contiene una chiamata a un metodo virtuale che non può essere preparato automaticamente.

Risoluzione

Chiamare PrepareMethod per il metodo virtuale.

Effetto sul runtime

Questo assistente al debug gestito non ha alcun effetto su CLR.

Risultato

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"

Configurazione

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

Example

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

Vedere anche