Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 invalidCERCall penelusuran kesalahan terkelola (MDA) diaktifkan ketika ada panggilan dalam grafik wilayah eksekusi terkendala (CER) ke metode yang tidak memiliki kontrak keandalan atau kontrak yang terlalu lemah. Kontrak yang lemah adalah kontrak yang menyatakan bahwa kerusakan status kasus terburuk adalah cakupan yang lebih besar daripada instans yang diteruskan ke panggilan, yaitu, AppDomain status atau proses mungkin rusak atau bahwa hasilnya tidak selalu dapat dihitung secara deterministik ketika dipanggil dalam CER.
Gejala
Hasil yang tidak terduga saat menjalankan kode dalam CER. Gejalanya tidak spesifik. Mereka bisa menjadi pengecualian , , ThreadAbortExceptionatau lainnya yang tidak terduga OutOfMemoryExceptionsaat panggilan ke metode yang tidak dapat diandalkan karena runtime tidak menyiapkannya sebelumnya atau melindunginya dari ThreadAbortException pengecualian pada runtime. Ancaman yang lebih besar adalah bahwa pengecualian apa pun yang dihasilkan dari metode pada runtime dapat meninggalkan AppDomain atau memproses dalam keadaan tidak stabil, yang bertentangan dengan tujuan CER. Alasan CER dibuat adalah untuk menghindari kerusakan status seperti ini. Gejala status rusak khusus aplikasi karena definisi status konsisten berbeda antara aplikasi.
Penyebab
Kode dalam CER memanggil fungsi tanpa ReliabilityContractAttribute atau dengan ReliabilityContractAttribute lemah yang tidak kompatibel dengan berjalan dalam CER.
Dalam hal sintaks kontrak keandalan, kontrak yang lemah adalah kontrak yang tidak menentukan Consistency nilai enumerasi atau menentukan Consistency nilai MayCorruptProcess, , MayCorruptAppDomainatau None. Salah satu kondisi ini menunjukkan bahwa kode yang disebut dapat menghambat upaya kode lain dalam CER untuk mempertahankan status yang konsisten. CER memungkinkan kode untuk memperlakukan kesalahan dengan cara yang sangat deterministik, mempertahankan invarian internal yang penting untuk aplikasi dan memungkinkannya untuk terus berjalan dalam menghadapi kesalahan sementara seperti pengecualian di luar memori.
Aktivasi MDA ini menunjukkan kemungkinan metode yang dipanggil dalam CER dapat gagal dengan cara yang tidak diharapkan pemanggil atau yang membuat AppDomain status atau proses rusak atau tidak dapat dipulihkan. Tentu saja, kode yang disebut mungkin dijalankan dengan benar dan masalahnya hanyalah kontrak yang hilang. Namun, masalah yang terlibat dalam penulisan kode yang dapat diandalkan tidak jelas dan tidak adanya kontrak adalah indikator yang baik kode mungkin tidak dijalankan dengan benar. Kontrak adalah indikator yang telah dikodekan oleh programmer dengan andal dan juga menjanjikan bahwa jaminan ini tidak akan berubah dalam revisi kode di masa mendatang. Artinya, kontrak adalah deklarasi niat dan bukan hanya detail implementasi.
Karena metode apa pun dengan kontrak yang lemah atau tidak ada berpotensi gagal dalam banyak cara yang tidak dapat diprediksi, runtime tidak mencoba menghapus kegagalan yang tidak dapat diprediksi sendiri dari metode yang diperkenalkan oleh kompilasi JIT malas, populasi kamus generik, atau pembatalan utas, misalnya. Artinya, ketika MDA ini diaktifkan, itu menunjukkan bahwa runtime tidak menyertakan metode yang disebut dalam CER yang didefinisikan; grafik panggilan dihentikan pada simpul ini karena terus mempersiapkan subtree ini akan membantu menutupi potensi kesalahan.
Resolusi
Tambahkan kontrak keandalan yang valid ke fungsi atau hindari menggunakan panggilan fungsi tersebut.
Efek pada Runtime
Efek memanggil kontrak yang lemah dari CER bisa menjadi kegagalan CER untuk menyelesaikan operasinya. Ini dapat menyebabkan kerusakan AppDomain status proses.
Keluaran
Berikut ini adalah contoh output dari MDA ini.
Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.
Konfigurasi
<mdaConfig>
<assistants>
<invalidCERCall />
</assistants>
</mdaConfig>