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