Dela via


virtualCERCall MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den virtualCERCall hanterade felsökningsassistenten (MDA) aktiveras som en varning som anger att en anropsplats inom ett cer-anropsdiagram (begränsad körningsregion) refererar till ett virtuellt mål, det vill säga ett virtuellt anrop till en icke-slutlig virtuell metod eller ett anrop med ett gränssnitt. CLR (Common Language Runtime) kan inte förutsäga målmetoden för dessa anrop enbart från mellanliggande språk och metadataanalys. Därför går det inte att förbereda anropsträdet som en del av CER-grafen och tråden avbryts i det underträdet kan inte blockeras automatiskt. Denna MDA varnar för fall där en CER kan behöva utökas med hjälp av explicita anrop till PrepareMethod metoden när den ytterligare information som krävs för att beräkna anropsmålet är känd vid körning.

Symtom

CER:er som inte körs när en tråd avbryts eller en programdomän tas bort.

Orsak

En CER innehåller ett anrop till en virtuell metod som inte kan förberedas automatiskt.

Åtgärd

Anropa PrepareMethod den virtuella metoden.

Effekt på körningen

Denna MDA har ingen effekt på 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"

Konfiguration

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

Exempel

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

Se även