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