Бөлісу құралы:


virtualCERCall MDA

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Помощник virtualCERCall по управляемой отладке (MDA) активируется как предупреждение, указывающее, что сайт вызова в пределах ограниченного региона выполнения (CER) ссылается на виртуальный целевой объект, то есть виртуальный вызов неконверционного виртуального метода или вызова с помощью интерфейса. Среда CLR не может прогнозировать метод назначения этих вызовов только из промежуточного языка и анализа метаданных. В результате дерево вызовов не может быть подготовлено как часть графа CER и прерываний потоков в этом поддереве не может быть автоматически заблокировано. Этот MDA предупреждает о случаях, когда cer-код может потребоваться расширить с помощью явных вызовов PrepareMethod метода после того, как дополнительная информация, необходимая для вычисления целевого объекта вызова, известна во время выполнения.

Симптомы

ЦС, которые не выполняются при прерывании потока или выгрузке домена приложения.

Причина

CER содержит вызов виртуального метода, который не может быть подготовлен автоматически.

Резолюция

Вызов PrepareMethod виртуального метода.

Влияние на среду выполнения

Этот MDA не влияет на среду CLR.

Выходные данные

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>

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

См. также