Wilayah Eksekusi Terbatas

Wilayah eksekusi terbatas (CER) adalah bagian dari mekanisme untuk penulisan kode terkelola yang andal. CER mendefinisikan area di mana runtime bahasa umum (CLR) dibatasi untuk mengeluarkan pengecualian out-of-band yang akan mencegah kode di area tersebut untuk dieksekusi secara keseluruhan. Di dalam wilayah itu, kode pengguna dibatasi dari mengeksekusi kode yang akan menghasilkan pengecualian out-of-band. Metode PrepareConstrainedRegions harus segera mendahului blok try dan menandai blok catch, finally, dan fault sebagai wilayah eksekusi yang dibatasi. Setelah ditandai sebagai wilayah terbatas, kode hanya boleh memanggil kode lain dengan kontrak keandalan yang kuat, dan kode tidak boleh mengalokasikan atau membuat panggilan virtual ke metode yang tidak siap atau tidak dapat diandalkan kecuali kode disiapkan untuk menangani kegagalan. CLR menunda pembatalan rangkaian untuk kode yang dieksekusi di CER.

Penting

CER hanya didukung di .NET Framework. Artikel ini tidak berlaku untuk .NET Core atau .NET 5 ke atas.

Wilayah eksekusi dibatasi digunakan dalam berbagai bentuk di CLR selain blok try beranotasi, terutama pengakhir kritis yang mengeksekusi di kelas yang diturunkan dari kelas CriticalFinalizerObject dan kode yang dieksekusi menggunakan metode ExecuteCodeWithGuaranteedCleanup.

Persiapan Awal CER

CLR mempersiapkan CER terlebih dahulu untuk menghindari kondisi kehabisan memori. Persiapan awal diperlukan agar CLR tidak menyebabkan kondisi kehabisan memori selama kompilasi just-in-time atau pemuatan jenis.

Pengembang harus menunjukkan bahwa wilayah kode adalah CER:

Kendala

Pengguna dibatasi dalam jenis kode yang dapat mereka tulis dalam CER. Kode tidak dapat menyebabkan pengecualian out-of-band, seperti yang mungkin terjadi akibat operasi berikut:

  • Alokasi eksplisit.

  • Boxing.

  • Memperoleh kunci.

  • Memanggil metode yang tidak siap secara virtual.

  • Memanggil metode dengan kontrak 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 khusus yang mendokumentasikan jaminan keandalan dan status kerusakan metode tertentu.

Jaminan Keandalan

Jaminan keandalan, diwakili oleh nilai enumerasi Cer, menunjukkan tingkat keandalan metode yang diberikan:

  • MayFail. Dalam kondisi luar biasa, metode ini mungkin gagal. Dalam hal ini, metode melaporkan kembali ke metode pemanggilan apakah berhasil atau gagal. Metode harus terkandung dalam CER untuk memastikan bahwa metode tersebut dapat melaporkan nilai kembalian.

  • None. Metode, jenis, atau rakitan tidak memiliki konsep CER dan kemungkinan besar tidak aman untuk dipanggil dalam CER tanpa mitigasi substansial dari keadaan korupsi. Itu tidak memanfaatkan jaminan CER. Ini menyiratkan hal berikut:

    1. Dalam kondisi luar biasa metode ini mungkin gagal.

    2. Metode ini mungkin atau mungkin tidak melaporkan bahwa itu gagal.

    3. Metode ini tidak ditulis untuk menggunakan CER, skenario yang paling mungkin.

    4. Jika metode, jenis, atau rakitan tidak secara eksplisit diidentifikasi untuk berhasil, itu secara implisit diidentifikasi sebagai None.

  • Success. Dalam kondisi luar biasa, metode ini dijamin berhasil. Untuk mencapai tingkat keandalan ini, Anda harus selalu membuat CER di sekitar metode yang dipanggil, bahkan saat dipanggil dari dalam wilayah non-CER. Suatu metode dikatakan berhasil jika mencapai apa yang dimaksudkan, meskipun keberhasilan dapat dilihat secara subjektif. Misalnya, menandai Hitungan dengan ReliabilityContractAttribute(Cer.Success) menyiratkan bahwa ketika dijalankan di bawah CER, itu selalu mengembalikan hitungan jumlah elemen di ArrayList dan tidak pernah bisa meninggalkan bidang internal dalam keadaan yang tidak ditentukan. Namun, metode CompareExchange juga ditandai sebagai sukses, dengan pengertian bahwa sukses dapat berarti nilai tidak dapat diganti dengan nilai baru karena kondisi balapan. Poin kuncinya adalah bahwa metode berperilaku seperti yang didokumentasikan untuk berperilaku, dan kode CER tidak perlu ditulis untuk mengharapkan perilaku yang tidak biasa di luar seperti apa kode yang benar tetapi tidak dapat diandalkan.

Tingkat korupsi

Tingkat korupsi, diwakili oleh nilai enumerasi Consistency, menunjukkan seberapa banyak keadaan bagian yang mungkin rusak di lingkungan tertentu:

  • MayCorruptAppDomain. Dalam kondisi luar biasa, runtime bahasa umum (CLR) tidak menjamin konsistensi status dalam domain aplikasi saat ini.

  • MayCorruptInstance. Dalam kondisi luar biasa, metode ini dijamin untuk membatasi keadaan korupsi pada instans saat ini.

  • MayCorruptProcess, Dalam kondisi yang luar biasa, CLR tidak memberikan jaminan mengenai konsistensi status; artinya, kondisinya mungkin merusak proses.

  • WillNotCorruptState. Dalam kondisi luar biasa, metode ini dijamin tidak akan merusak keadaan.

Keandalan try/catch/finally

Keandalan try/catch/finally adalah mekanisme penanganan pengecualian dengan tingkat jaminan prediktabilitas yang sama dengan versi yang tidak dikelola. Blok catch/finally adalah CER. Metode dalam blok memerlukan persiapan terlebih dahulu dan tidak boleh terputus.

Dalam .NET Framework versi 2.0, kode menginformasikan runtime bahwa percobaan dapat diandalkan dengan memanggil PrepareConstrainedRegions segera sebelum blok coba. PrepareConstrainedRegions adalah anggota, RuntimeHelperskelas dukungan pengkompilasi. Hubungi PrepareConstrainedRegions secara langsung sambil menunggu ketersediaannya melalui pengompilasi.

Wilayah Noninterruptible

Sebuah wilayah noninterruptible mengelompokkan satu set instruksi ke dalam CER.

Dalam .NET Framework versi 2.0, ketersediaan tertunda melalui dukungan pengompilasi, kode pengguna membuat wilayah noninterruptible dengan try/catch/finally yang andal yang berisi blok try/catch kosong yang didahului oleh pemanggilan metode PrepareConstrainedRegions.

Objek Pengakhir Kritis

CriticalFinalizerObject menjamin bahwa pengumpulan sampah akan menjalankan pengakhir. Setelah alokasi, pengakhir dan grafik panggilannya disiapkan terlebih dahulu. Metode pengakhir dijalankan dalam CER, dan harus mematuhi semua batasan pada CER dan pengakhir.

Semua jenis yang diwarisi dari SafeHandle dan CriticalHandle dijamin memiliki pengakhir yang dijalankan dalam CER. Terapkan ReleaseHandle di kelas turunan SafeHandle untuk mengeksekusi kode apa pun yang diperlukan untuk membebaskan pegangan.

Kode Tidak Diizinkan di CER

Operasi berikut tidak diizinkan di CER:

  • Alokasi eksplisit.

  • Memperoleh kunci.

  • Boxing.

  • Akses array multidimensi.

  • Metode panggilan melalui refleksi.

  • Enter atau Lock.

  • Pemeriksaan keamanan. Jangan melakukan tuntutan, cukup hubungkan tuntutan.

  • Isinst dan Castclass untuk objek dan proksi COM

  • Mendapatkan atau mengatur bidang pada proksi transparan.

  • Serialisasi.

  • Pointer fungsi dan delegasi.

Lihat juga