virtualCERCall MDA

Not

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

Yönetilen virtualCERCall hata ayıklama yardımcısı (MDA), kısıtlanmış yürütme bölgesi (CER) çağrı grafı içindeki bir çağrı sitesinin bir sanal hedefe, yani son olmayan bir sanal yönteme yapılan sanal çağrıya veya arabirim kullanan bir çağrıya başvurduğunu belirten bir uyarı olarak etkinleştirilir. Ortak dil çalışma zamanı (CLR), bu çağrıların hedef yöntemini yalnızca ara dil ve meta veri analizinden tahmin edemez. Sonuç olarak, çağrı ağacı CER grafiğinin bir parçası olarak hazırlanamaz ve bu alt ağaçtaki iş parçacığı iptalleri otomatik olarak engellenemez. Bu MDA, çağrı hedefini hesaplamak için gereken ek bilgiler çalışma zamanında bilindikten sonra yöntemine PrepareMethod yönelik açık çağrılar kullanılarak bir CER'in genişletilmesi gerekebileceği durumlarla ilgili uyarır.

Belirtiler

bir iş parçacığı durdurulduğunda veya uygulama etki alanı kaldırıldığında çalışmayan CER'ler.

Neden

CER, otomatik olarak hazırlanamayan bir sanal yönteme çağrı içerir.

Çözüm

Sanal yöntemi çağırın PrepareMethod .

Çalışma Zamanı üzerindeki etkisi

Bu MDA'nın CLR üzerinde hiçbir etkisi yoktur.

Çıktı

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"

Yapılandırma

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

Örnek

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

Ayrıca bkz.