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.
Wilayah eksekusi yang dibatasi (CER) adalah bagian dari mekanisme untuk menulis kode terkelola yang andal. CER mendefinisikan area di mana runtime bahasa umum (CLR) dibatasi untuk melemparkan pengecualian di luar jalur, yang akan mencegah seluruh kode di area tersebut dijalankan. Dalam wilayah tersebut, kode pengguna dibatasi dari menjalankan kode yang akan mengakibatkan pelemparan pengecualian di luar band. Metode PrepareConstrainedRegions harus segera mendahului try blok dan menandai catch, finally, dan fault blok sebagai wilayah eksekusi yang dibatasi. Setelah ditandai sebagai wilayah yang dibatasi, kode hanya boleh memanggil kode lain dengan kontrak keandalan yang kuat, dan kode tidak boleh mengalokasikan atau melakukan panggilan virtual ke metode yang tidak siap atau tidak dapat diandalkan kecuali kode disiapkan untuk menangani kegagalan. CLR menunda pembatalan utas untuk kode yang dijalankan dalam CER.
Penting
CER hanya didukung dalam .NET Framework. Artikel ini tidak berlaku untuk .NET Core atau .NET 5 ke atas.
Wilayah eksekusi yang dibatasi digunakan dalam bentuk yang berbeda di CLR selain blok yang dianotasikan try, khususnya finalizer yang dieksekusi dalam kelas turunan dari kelas CriticalFinalizerObject dan kode yang dieksekusi menggunakan metode ExecuteCodeWithGuaranteedCleanup.
Persiapan Lanjutan CER
CLR mempersiapkan CER di muka untuk menghindari kondisi kehabisan memori. Persiapan lanjutan diperlukan sehingga CLR tidak menyebabkan kondisi kehabisan memori selama kompilasi just-in-time atau pemuatan jenis.
Pengembang diperlukan untuk menunjukkan bahwa wilayah kode adalah CER:
Wilayah CER tingkat atas dan metode dalam grafik panggilan penuh yang memiliki atribut ReliabilityContractAttribute yang diterapkan disiapkan terlebih dahulu. ReliabilityContractAttribute hanya dapat menyatakan jaminan dari Success atau MayFail.
Persiapan lanjutan tidak dapat dilakukan untuk panggilan yang tidak dapat ditentukan secara statis, seperti pengiriman virtual. Gunakan metode PrepareMethod dalam kasus ini. Saat menggunakan metode ExecuteCodeWithGuaranteedCleanup, atribut PrePrepareMethodAttribute harus diterapkan ke kode pembersih.
Keterbatasan
Pengguna dibatasi dalam jenis kode yang dapat mereka tulis dalam CER. Kode tidak dapat menyebabkan pengecualian tidak terduga, seperti yang mungkin dihasilkan dari operasi berikut:
Alokasi eksplisit.
Tinju.
Mendapatkan kunci.
Memanggil metode yang tidak siap secara virtual.
Memanggil metode dengan ketentuan keandalan yang lemah atau tidak ada.
Di .NET Framework versi 2.0, batasan ini adalah panduan. Diagnostik disediakan melalui alat analisis kode.
Kontrak Keandalan
ReliabilityContractAttribute adalah atribut kustom yang mencantumkan jaminan keandalan dan status kerusakan dari metode tertentu.
Jaminan Keandalan
Jaminan keandalan, yang diwakili oleh Cer nilai enumerasi, menunjukkan tingkat keandalan metode tertentu:
MayFail. Dalam kondisi luar biasa, metode mungkin gagal. Dalam hal ini, metode memberitahukan kepada metode pemanggil apakah berhasil atau gagal. Metode harus dimuat dalam CER untuk memastikan bahwa metode tersebut dapat melaporkan nilai pengembalian.
None. Metode, jenis, atau komponen tidak memiliki konsep CER dan kemungkinan besar tidak aman untuk dipanggil di dalam CER tanpa mitigasi besar terhadap korupsi status. Ini tidak memanfaatkan jaminan CER. Ini menyiratkan hal berikut:
Dalam kondisi luar biasa, metode mungkin gagal.
Metode ini mungkin atau mungkin tidak melaporkan kegagalan.
Metode ini tidak ditulis untuk menggunakan CER, skenario yang paling mungkin.
Jika metode, jenis, atau rakitan tidak diidentifikasi secara eksplisit untuk berhasil, metode tersebut secara implisit diidentifikasi sebagai None.
Success. Dalam kondisi luar biasa, metode dijamin berhasil. Untuk mencapai tingkat keandalan ini, Anda harus selalu membuat CER di sekitar metode yang dipanggil, bahkan ketika dipanggil dari dalam wilayah non-CER. Metode berhasil jika mencapai apa yang dimaksudkan, meskipun keberhasilan dapat dilihat secara subjektif. Misalnya, menandai Count dengan
ReliabilityContractAttribute(Cer.Success)menyiratkan bahwa ketika dijalankan di bawah CER, itu selalu mengembalikan hitungan jumlah elemen di ArrayList dan tidak pernah dapat meninggalkan bidang internal dalam keadaan tidak ditentukan. Namun, metode CompareExchange ini dianggap berhasil juga, dengan pemahaman bahwa keberhasilan mungkin berarti nilai tidak dapat diganti dengan nilai baru karena kondisi persaingan. Poin utamanya adalah bahwa metode berfungsi sesuai dengan dokumentasinya, dan kode CER tidak perlu ditulis untuk mengantisipasi perilaku yang tidak biasa di luar dari apa yang dapat diharapkan dari kode yang benar tetapi tidak dapat diandalkan.
Tingkat kerusakan
Tingkat kerusakan, yang diwakili oleh Consistency nilai enumerasi, menunjukkan berapa banyak status yang mungkin rusak di lingkungan tertentu:
MayCorruptAppDomain. Dalam kondisi luar biasa, CLR (Common Language Runtime) tidak memberikan jaminan mengenai konsistensi keadaan di domain aplikasi saat ini.
MayCorruptInstance. Dalam kondisi luar biasa, metode ini dijamin membatasi korupsi status pada instans saat ini.
MayCorruptProcess, Dalam kondisi luar biasa, CLR tidak membuat jaminan mengenai konsistensi status; artinya, kondisi mungkin merusak proses.
WillNotCorruptState. Dalam kondisi luar biasa, metode dijamin tidak merusak keadaan.
Keandalan coba/tangkap/akhirnya
Keandalan try/catch/finally adalah mekanisme penanganan pengecualian dengan tingkat jaminan prediksi yang sama dengan versi yang tidak dikelola. Blok catch/finally adalah CER. Metode dalam blok memerlukan persiapan terlebih dahulu dan harus tidak dapat diinterupsi.
Dalam .NET Framework versi 2.0, kode menginformasikan runtime bahwa percobaan dapat diandalkan dengan memanggil PrepareConstrainedRegions segera sebelum blok coba. PrepareConstrainedRegions adalah anggota dari RuntimeHelpers, kelas dukungan kompilator. Panggil PrepareConstrainedRegions langsung jika tersedia melalui kompilator.
Wilayah Yang Tidak Dapat Diinterupsi
Wilayah yang tidak dapat diinterupsi mengelompokkan serangkaian instruksi ke dalam CER.
Dalam .NET Framework versi 2.0, ketersediaan tertunda melalui dukungan kompilator, kode pengguna membuat wilayah yang tidak dapat diinterupsi dengan blok try/catch/finally yang andal yang berisi blok try/catch kosong yang didahului oleh panggilan metode PrepareConstrainedRegions.
Objek Penyelesai Kritis
Sebuah CriticalFinalizerObject menjamin bahwa pengumpulan sampah akan menjalankan finalizer. Setelah alokasi, finalizer dan grafik panggilannya disiapkan terlebih dahulu. Metode finalizer dijalankan dalam sebuah CER dan harus mematuhi semua batasan yang berlaku pada CER dan finalizer.
Jenis apa pun yang mewarisi dari SafeHandle dan CriticalHandle dijamin finalizernya akan dieksekusi dalam CER. Terapkan ReleaseHandle dalam SafeHandle kelas turunan untuk menjalankan kode apa pun yang diperlukan untuk membebaskan handle.
Kode Tidak Diizinkan di CER
Operasi berikut tidak diizinkan dalam CER:
Alokasi eksplisit.
Mendapatkan kunci.
Tinju.
Akses array multidmensional.
Metode memanggil melalui refleksi.
Pemeriksaan keamanan. Jangan melakukan tuntutan, hanya menghubungkan tuntutan.
Mendapatkan atau mengatur elemen pada proksi transparan.
Serialisasi.
Penunjuk fungsi dan delegat.