Sdílet prostřednictvím


virtualCERCall – pomocník spravovaného ladění (MDA)

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Pomocník virtualCERCall spravovaného ladění (MDA) se aktivuje jako upozornění, které indikuje, že web volání v rámci omezené oblasti provádění (CER) odkazuje na virtuální cíl, tj. virtuální volání nekončové virtuální metody nebo volání pomocí rozhraní. Modul CLR (Common Language Runtime) nemůže předpovědět cílovou metodu těchto volání pouze zprostředkujícího jazyka a analýzy metadat. V důsledku toho nelze strom volání připravit jako součást grafu CER a přerušení vláken v daném podstromu nelze automaticky blokovat. Tato autorita MDA varuje případy, kdy je možné, že cer může být nutné rozšířit pomocí explicitních volání PrepareMethod metody, jakmile jsou další informace potřebné k výpočtu cíle volání známé za běhu.

Příznaky

CERS, které se nespustí, když je přerušeno vlákno nebo je uvolněna doména aplikace.

Příčina

CER obsahuje volání virtuální metody, která se nedá automaticky připravit.

Rozlišení

Volání PrepareMethod virtuální metody

Vliv na modul runtime

Tento mdA nemá žádný vliv na CLR.

Výstup

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"

Konfigurace

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

Příklad

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

Viz také