Freigeben über


virtualCERCall MDA

Hinweis

Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Der virtualCERCall verwaltete Debugging-Assistent (Managed Debugging Assistant, MDA) wird als Warnung aktiviert, die angibt, dass sich ein Aufrufstandort innerhalb eines eingeschränkten Ausführungsbereichs (CER)-Aufrufdiagramms auf ein virtuelles Ziel bezieht, d. h. ein virtueller Aufruf einer nicht endgültigen virtuellen Methode oder eines Aufrufs über eine Schnittstelle. Die Common Language Runtime (CLR) kann die Zielmethode dieser Aufrufe nicht allein aus der Zwischensprache und Metadatenanalyse vorhersagen. Daher kann die Aufrufstruktur nicht als Teil des CER-Diagramms und threadabbruchs in dieser Unterstruktur nicht automatisch blockiert werden. Diese MDA warnt vor Fällen, in denen eine CER möglicherweise durch explizite Aufrufe der PrepareMethod Methode erweitert werden muss, sobald die zusätzlichen Informationen, die zum Berechnen des Aufrufziels erforderlich sind, zur Laufzeit bekannt sind.

Symptome

CERs, die nicht ausgeführt werden, wenn ein Thread abgebrochen wird oder eine Anwendungsdomäne entladen wird.

Ursache

Eine CER enthält einen Aufruf einer virtuellen Methode, die nicht automatisch vorbereitet werden kann.

Beschluss

Aufrufen PrepareMethod der virtuellen Methode.

Effekt auf die Laufzeit

Diese MDA hat keine Auswirkungen auf die 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>

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

Siehe auch