Megosztás a következőn keresztül:


virtualCERCall MDA

Feljegyzés

Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A virtualCERCall felügyelt hibakeresési segéd (MDA) figyelmeztetésként van aktiválva, amely azt jelzi, hogy a korlátozott végrehajtási régióban (CER) lévő hívási gráfok egy virtuális célhelyre, azaz nem végleges virtuális metódusra irányuló virtuális hívásra vagy interfészt használó hívásra utalnak. A közös nyelvi futtatókörnyezet (CLR) nem tudja előrejelezni ezeknek a hívásoknak a célmetódusát egyedül a köztes nyelv és a metaadatok elemzése alapján. Ennek eredményeképpen a hívásfa nem készíthető elő a CER-gráf részeként, és a szál megszakításai nem tilthatók le automatikusan az adott részhalmazban. Ez az MDA figyelmeztet azokra az esetekre, amikor a CER-t explicit hívásokkal ki kell terjeszteni a PrepareMethod metódushoz, miután a hívási cél kiszámításához szükséges további információk ismertek a futásidőben.

Hibajelenségek

Azok a CER-ek, amelyek nem futnak, ha megszakítanak egy szálat, vagy egy alkalmazástartományt törölnek.

Ok

A CER olyan virtuális metódus hívását tartalmazza, amely nem készíthető elő automatikusan.

Resolution (Osztás)

Hívja meg PrepareMethod a virtuális metódust.

Effektus a futtatókörnyezetre

Ez az MDA nincs hatással a CLR-re.

Hozam

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"

Konfiguráció

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

Példa

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

Lásd még