Kısıtlı Yürütme Bölgeleri
Kısıtlanmış yürütme bölgesi (CER), güvenilir yönetilen kod yazmaya yönelik bir mekanizmanın parçasıdır. CER, ortak dil çalışma zamanının (CLR) alandaki kodun tamamen yürütülmesini engelleyecek bant dışı özel durumlar oluşturmasının kısıtlandığı bir alan tanımlar. Bu bölge içinde kullanıcı kodu, bant dışı özel durumların ortaya çıkmasıyla sonuçlanan kodun yürütülmesinden kısıtlanır. yöntemi bir bloğun PrepareConstrainedRegions hemen önünde try
olmalı ve , finally
ve fault
bloklarını kısıtlanmış yürütme bölgeleri olarak işaretlemelidircatch
. Kısıtlanmış bölge olarak işaretlendikten sonra, kod yalnızca güçlü güvenilirlik sözleşmelerine sahip diğer kodları çağırmalı ve kod hataları işlemeye hazırlanmadığı sürece hazırlıksız veya güvenilir olmayan yöntemlere sanal çağrılar yapmamalıdır. CLR, CER'de yürütülen kod için iş parçacığı durdurmalarını geciktiriyor.
Önemli
CER yalnızca .NET Framework'te desteklenir. Bu makale .NET Core veya .NET 5 ve üzeri için geçerli değildir.
Kısıtlanmış yürütme bölgeleri, clr'de farklı biçimlerde, özellikle sınıfından CriticalFinalizerObject türetilen sınıflarda yürütülen kritik sonlandırıcılar ve yöntemi kullanılarak yürütülen koda ek açıklamalı try
bir bloğun ExecuteCodeWithGuaranteedCleanup yanı sıra kullanılır.
CER İlerleme Hazırlığı
CLR, bellek yetersiz koşullarını önlemek için CER'leri önceden hazırlar. CLR'nin tam zamanında derleme veya tür yükleme sırasında bellek yetersizliği durumuna neden olmaması için önceden hazırlık gereklidir.
Geliştirici, bir kod bölgesinin CER olduğunu belirtmek için gereklidir:
Özniteliğin uygulandığı tam çağrı grafiğindeki ReliabilityContractAttribute en üst düzey CER bölgesi ve yöntemleri önceden hazırlanır. veya için ReliabilityContractAttribute yalnızca durum garantileri SuccessMayFailolabilir.
Sanal gönderim gibi statik olarak belirlenemeyen çağrılar için önceden hazırlık yapılamaz. PrepareMethod Bu durumlarda yöntemini kullanın. yöntemi kullanılırken ExecuteCodeWithGuaranteedCleanup , PrePrepareMethodAttribute özniteliği temizleme koduna uygulanmalıdır.
Sınırlamalar
Kullanıcılar, CER'de yazabilecekleri kod türüyle kısıtlanır. Kod, aşağıdaki işlemlerden kaynaklanabileceği gibi bant dışı bir özel duruma neden olamaz:
Açık ayırma.
Boks.
Kilit almak.
Hazır olmayan yöntemleri sanal olarak çağırma.
Zayıf veya var olmayan bir güvenilirlik sözleşmesine sahip yöntemleri çağırma.
.NET Framework sürüm 2.0'da bu kısıtlamalar yönergelerdir. Tanılama, kod çözümleme araçları aracılığıyla sağlanır.
Güvenilirlik Sözleşmeleri
ReliabilityContractAttribute, güvenilirlik garantilerini ve belirli bir yöntemin bozulma durumunu belgeleyen özel bir özniteliktir.
Güvenilirlik Garantileri
Numaralandırma değerleriyle Cer temsil edilen güvenilirlik garantileri, belirli bir yöntemin güvenilirlik derecesini gösterir:
MayFail. Olağanüstü koşullar altında yöntemi başarısız olabilir. Bu durumda yöntemi, başarılı veya başarısız olup olmadığını çağıran yönteme geri raporlar. Yöntemin, dönüş değerini bildirediğinden emin olmak için bir CER içinde bulunması gerekir.
None. Yöntemin, türün veya derlemenin CER kavramı yoktur ve büyük olasılıkla durum bozulmasını önemli ölçüde azaltmadan CER içinde çağrı yapmak güvenli değildir. CER garantilerinden yararlanmaz. Bu, aşağıdakileri ifade eder:
Olağanüstü koşullar altında yöntem başarısız olabilir.
yöntemi başarısız olduğunu bildirebilir veya bildirmeyebilir.
yöntemi, en olası senaryo olan CER kullanacak şekilde yazılmaz.
Başarılı olması için bir yöntem, tür veya derleme açıkça tanımlanmazsa, örtük olarak olarak Nonetanımlanır.
Success. Olağanüstü koşullarda yöntemin başarılı olması garanti edilir. Bu güvenilirlik düzeyini elde etmek için, CER olmayan bir bölgeden çağrıldığında bile her zaman çağrılan yöntemin etrafında bir CER oluşturmanız gerekir. Bir yöntem amaçlananı gerçekleştirirse başarılı olur, ancak başarı öznel olarak görüntülenebilir. Örneğin, Sayı'nın ile
ReliabilityContractAttribute(Cer.Success)
işaretlenmesi, CER altında çalıştırıldığında her zaman içindeki ArrayList öğelerin sayısını döndürdüğü ve iç alanları hiçbir zaman belirsiz bir durumda bırakamayacağı anlamına gelir. Ancak yöntem CompareExchange , başarı olarak işaretlenir ve başarının bir yarış durumu nedeniyle değerin yeni bir değerle değiştirilemediği anlamına gelebileceği anlamına gelir. Önemli nokta, yöntemin davranış belgelendiği şekilde davranması ve CER kodunun doğru ancak güvenilir olmayan kodun nasıl görüneceğinin ötesinde olağan dışı davranışlar beklenecek şekilde yazılması gerekmemesidir.
Bozulma düzeyleri
Numaralandırma değerleriyle Consistency temsil edilen bozulma düzeyleri, belirli bir ortamda ne kadar durumun bozulabileceğini gösterir:
MayCorruptAppDomain. Olağanüstü koşullar altında ortak dil çalışma zamanı (CLR), geçerli uygulama etki alanındaki durum tutarlılığıyla ilgili hiçbir garanti sağlamaz.
MayCorruptInstance. Olağanüstü koşullar altında, yöntemin durum bozulmasını geçerli örnekle sınırlaması garanti edilir.
MayCorruptProcess, olağanüstü koşullar altında, CLR durum tutarlılığıyla ilgili hiçbir garanti sağlamaz; yani, koşul işlemi bozabilir.
WillNotCorruptState. Olağanüstü koşullar altında, yöntemin durumu bozmaması garanti edilir.
Güvenilirlik deneme/yakalama/son olarak
Güvenilirlik try/catch/finally
, yönetilmeyen sürümle aynı düzeyde tahmin edilebilirlik garantilerine sahip bir özel durum işleme mekanizmasıdır. catch/finally
Blok CER'dir. Bloktaki yöntemler önceden hazırlık gerektirir ve kesintisiz olmalıdır.
.NET Framework sürüm 2.0'da kod, deneme bloğundan hemen önce çağrı PrepareConstrainedRegions yaparak denemenin güvenilir olduğunu çalışma zamanına bildirir. PrepareConstrainedRegions , bir derleyici destek sınıfının üyesidir RuntimeHelpers. Derleyiciler aracılığıyla doğrudan kullanılabilirliğini bekleyen çağrısı PrepareConstrainedRegions .
Kesintisiz Bölgeler
Kesintisiz bir bölge, bir dizi yönergeyi BIR CER olarak gruplar.
.NET Framework sürüm 2.0'da, derleyici desteği aracılığıyla kullanılabilirliği bekleyen kullanıcı kodu, bir yöntem çağrısından önce PrepareConstrainedRegions boş bir try/catch bloğu içeren güvenilir bir try/catch/finally ile kesintisiz bölgeler oluşturur.
Kritik Sonlandırıcı Nesnesi
Bir CriticalFinalizerObject , çöp toplamanın sonlandırıcıyı yürüteceğini garanti eder. Ayırma sonrasında, sonlandırıcı ve çağrı grafiği önceden hazırlanır. Sonlandırıcı yöntemi bir CER'de yürütülür ve CER'ler ve sonlandırıcılar üzerindeki tüm kısıtlamalara uyması gerekir.
ve CriticalHandle öğesini SafeHandle devralan tüm türlerin sonlandırıcılarının bir CER içinde yürütülmesi garanti edilir. Tanıtıcıyı boşaltmak için gereken tüm kodları yürütmek için türetilmiş sınıflarda SafeHandle uygulayınReleaseHandle.
CER'lerde Koda İzin Verilmiyor
CER'lerde aşağıdaki işlemlere izin verilmez:
Açık ayırmalar.
Kilit almak.
Boks.
Çok boyutlu dizi erişimi.
Yansıma aracılığıyla yöntem çağrıları.
Güvenlik denetimleri. Talepleri yerine getirmeyin, yalnızca bağlantı talepleri.
Saydam proxy'de alanları alma veya ayarlama.
Seri -leştirme.
İşlev işaretçileri ve temsilciler.