Udostępnij za pośrednictwem


virtualCERCall MDA

Uwaga

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.

Asystent virtualCERCall zarządzanego debugowania (MDA) jest aktywowany jako ostrzeżenie wskazujące, że lokacja wywołania w grafie wywołania ograniczonego regionu wykonywania (CER) odnosi się do wirtualnego obiektu docelowego, czyli wirtualnego wywołania metody wirtualnej innej niż finalna lub wywołania przy użyciu interfejsu. Środowisko uruchomieniowe języka wspólnego (CLR) nie może przewidzieć metody docelowej tych wywołań z samego języka pośredniego i analizy metadanych. W związku z tym nie można przygotować drzewa wywołań w ramach grafu CER i przerwania wątku w tym poddrzewie nie może być automatycznie blokowane. Ta usługa MDA ostrzega przed przypadkami, w których cer może być konieczne rozszerzenie przy użyciu jawnych wywołań PrepareMethod metody, gdy dodatkowe informacje wymagane do obliczenia celu wywołania są znane w czasie wykonywania.

Objawy

CeRs, które nie są uruchamiane, gdy wątek zostanie przerwany lub domena aplikacji zostanie zwolniona.

Przyczyna

Cer zawiera wywołanie metody wirtualnej, której nie można przygotować automatycznie.

Rozwiązanie

Wywołaj PrepareMethod metodę wirtualną.

Wpływ na środowisko uruchomieniowe

Ta usługa MDA nie ma wpływu na CLR.

Wyjście

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"

Konfigurowanie

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

Przykład

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

Zobacz też