virtualCERCall MDA

virtualCERCall Asystent zarządzanego debugowania (MDA) jest aktywowany jako ostrzeżenie wskazujące, że lokacja wywołania w regionie wykonywania ograniczonego (CER) odwołuje się do wirtualnego obiektu docelowego, czyli wirtualnego wywołania metody wirtualnej innej niż ostateczna lub wywołania przy użyciu interfejsu. Środowisko uruchomieniowe języka wspólnego (CLR) nie może przewidzieć metody docelowej tych wywołań z języka pośredniego i samej analizy metadanych. W związku z tym drzewo wywołań nie może być przygotowane w ramach grafu CER i przerwania wątku w tym poddrzewie nie może być automatycznie blokowane. To rozwiązanie MDA ostrzega przed przypadkami, w których cer może wymagać rozszerzenia przy użyciu jawnych wywołań metody, gdy dodatkowe informacje wymagane do PrepareMethod obliczenia obiektu docelowego wywołania są znane w czasie wykonywania.

Objawy

Jednostki CER, 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 metodę PrepareMethod wirtualną.

Wpływ na środowisko uruchomieniowe

To rozwiązanie MDA nie ma wpływu na clR.

Dane wyjściowe

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"  

Konfiguracja

<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 także