Bagikan melalui


virtualCERCall MDA

Nota

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Asisten virtualCERCall penelusuran kesalahan terkelola (MDA) diaktifkan sebagai peringatan yang menunjukkan bahwa situs panggilan dalam grafik panggilan wilayah eksekusi (CER) yang dibatasi mengacu pada target virtual, yaitu, panggilan virtual ke metode virtual non-final atau panggilan menggunakan antarmuka. Runtime bahasa umum (CLR) tidak dapat memprediksi metode tujuan panggilan ini dari bahasa perantara dan analisis metadata saja. Akibatnya, pohon panggilan tidak dapat disiapkan sebagai bagian dari grafik CER dan pembatalan utas dalam subtree tersebut tidak dapat diblokir secara otomatis. MDA ini memperingatkan kasus di mana CER mungkin perlu diperluas dengan menggunakan panggilan eksplisit ke PrepareMethod metode setelah informasi tambahan yang diperlukan untuk menghitung target panggilan diketahui pada runtime.

Gejala

CER yang tidak berjalan saat utas dibatalkan atau domain aplikasi dibongkar.

Penyebab

CER berisi panggilan ke metode virtual yang tidak dapat disiapkan secara otomatis.

Resolusi

Panggil PrepareMethod metode virtual.

Efek pada Runtime

MDA ini tidak berpengaruh pada CLR.

Keluaran

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"

Konfigurasi

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

Lihat juga