virtualCERCall MDA
Управляемый помощник по отладке (MDA) virtualCERCall активируется как предупреждение, указывающее на то, что точка вызова в графе вызова области с ограничением исполнения (CER) относится к виртуальному целевому объекту, то есть к виртуальному вызову неконечного виртуального метода или к вызову с помощью интерфейса. Среде CLR не удается спрогнозировать конечный метод данных вызовов только на основании промежуточного языка и анализа метаданных. В результате дерево вызовов невозможно подготовить как часть графа CER, и прерывания потока в данном поддереве не удается блокировать автоматически. Этот MDA предупреждает о случаях, когда CER требуется расширить с помощью явных вызовов метода PrepareMethod, если дополнительные сведения, требуемые для вычисления целевого объекта вызова, известны во время выполнения.
Признаки
CER, которые не выполняются при прерывании потока или при выгрузке домена приложения.
Причина
CER содержит вызов виртуального метода, который не удается автоматически подготовить.
Решение
Следует вызвать PrepareMethod для виртуального метода.
Влияние на среду выполнения
Данный помощник по отладке управляемого кода не оказывает влияния на среду 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"
Конфигурация
<mdaConfig>
<assistants>
< VirtualCERCall />
</assistants>
</mdaConfig>
Пример
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();
}
}
См. также
Ссылки
Основные понятия
Диагностика ошибок посредством управляемых помощников по отладке