Oblasti omezeného provádění
Oblast omezeného spouštění (CER) je součástí mechanismu pro vytváření spolehlivého spravovaného kódu. Cer definuje oblast, ve které je modul CLR (Common Language Runtime) omezený z vyvolání výjimek mimo pásma, které by zabránilo spuštění kódu v oblasti v celé oblasti. V této oblasti je uživatelský kód omezen spuštěním kódu, který by vedlo k vyvolání výjimek mimo pásmo. Metoda PrepareConstrainedRegions musí bezprostředně před blok a značky try
catch
, finally
a fault
bloky jako omezené oblasti provádění. Jakmile je kód označený jako omezená oblast, musí volat pouze jiný kód se silnými kontrakty spolehlivosti a kód by neměl přidělovat ani provádět virtuální volání pro nepřipravené nebo nespolehlivé metody, pokud kód není připravený na zpracování selhání. CLR zpožďuje přerušení vlákna pro kód, který se spouští v CER.
Důležité
Cer je podporován pouze v rozhraní .NET Framework. Tento článek se nevztahuje na .NET Core nebo .NET 5 a vyšší.
Oblasti omezeného spouštění se používají v různých formách modulu CLR kromě bloku s poznámkami try
, zejména kritické finalizátory spouštěné ve třídách odvozených z CriticalFinalizerObject třídy a kódu spouštěné pomocí ExecuteCodeWithGuaranteedCleanup metody.
Příprava předem na CER
MODUL CLR předem připraví CER, aby se zabránilo nedostatku paměti. Vyžaduje se pokročilá příprava, takže CLR nezpůsobí nedostatek paměti během kompilace za běhu nebo načítání typu.
Vývojář musí označit, že oblast kódu je CER:
Oblast a metody CER nejvyšší úrovně v úplném grafu volání, které mají ReliabilityContractAttribute použitý atribut, jsou předem připravené. Jedinými ReliabilityContractAttribute státními zárukami Success nebo MayFail.
Pokročilou přípravu nelze provést pro volání, která nelze staticky určit, například virtuální odeslání. V těchto případech použijte metodu PrepareMethod . Při použití ExecuteCodeWithGuaranteedCleanup metody PrePrepareMethodAttribute by se měl atribut použít pro vyčištění kódu.
Omezení
Uživatelé jsou omezeni typem kódu, který můžou psát v CER. Kód nemůže způsobit výjimku mimo pásmo, například z následujících operací:
Explicitní přidělení
Boxu.
Získánízámkuho
Virtuální volání nepřipravených metod.
Volání metod se slabým nebo neexistující kontraktem spolehlivosti
V rozhraní .NET Framework verze 2.0 jsou tato omezení pokyny. Diagnostika se poskytuje prostřednictvím nástrojů pro analýzu kódu.
Smlouvy o spolehlivosti
Jedná se ReliabilityContractAttribute o vlastní atribut, který dokumentuje záruky spolehlivosti a stav poškození dané metody.
Záruky spolehlivosti
Záruky spolehlivosti reprezentované Cer hodnotami výčtu označují stupeň spolehlivosti dané metody:
MayFail. Za výjimečných podmínek může metoda selhat. V tomto případě metoda hlásí zpět volající metodu bez ohledu na to, zda byla úspěšná nebo neúspěšná. Metoda musí být obsažena v CER, aby se zajistilo, že může hlásit návratovou hodnotu.
None. Metoda, typ nebo sestavení nemá žádný koncept CER a s největší pravděpodobností není bezpečné volat v rámci CER bez podstatného zmírnění rizika poškození stavu. Nevyužívá záruky CER. To znamená následující:
Za výjimečných podmínek může metoda selhat.
Metoda může nebo nemusí nahlásit, že selhala.
Metoda není zapsána pro použití CER, nejpravděpodobnější scénář.
Pokud metoda, typ nebo sestavení není explicitně identifikována k úspěchu, je implicitně identifikována jako None.
Success. Za výjimečných podmínek je zaručeno, že metoda bude úspěšná. Pokud chcete dosáhnout této úrovně spolehlivosti, měli byste vždy vytvořit CER kolem volané metody, i když je volána z oblasti, která není cer. Metoda je úspěšná, pokud dosáhne toho, co je zamýšleno, i když úspěch lze zobrazit subjektivním způsobem. Označení Count například
ReliabilityContractAttribute(Cer.Success)
znamená, že když je spuštěn pod CER, vrátí vždy počet prvků v objektu ArrayList a nikdy nemůže opustit interní pole v nedeterminované stavu. Metoda CompareExchange je však označena také jako úspěch, s pochopením, že úspěch může znamenat, že hodnota nemohla být nahrazena novou hodnotou kvůli konfliktu časování. Klíčovým bodem je, že metoda se chová způsobem, jakým se chová, a kód CER nemusí být zapsán tak, aby očekával neobvyklé chování nad rámec toho, jak správný, ale nespolehlivý kód by vypadal.
Úrovně poškození
Úrovně poškození reprezentované Consistency hodnotami výčtu označují, kolik stavu může být v daném prostředí poškozeno:
MayCorruptAppDomain. Za výjimečných podmínek modul CLR (Common Language Runtime) neposkytuje žádné záruky týkající se konzistence stavu v aktuální doméně aplikace.
MayCorruptInstance. Za výjimečných podmínek je zaručeno, že metoda omezí poškození stavu na aktuální instanci.
MayCorruptProcessza výjimečných podmínek neposkytuje CLR žádné záruky týkající se konzistence stavu; to znamená, že podmínka může poškodit proces.
WillNotCorruptState. Za výjimečných podmínek je zaručeno, že není poškozena.
Pokus o spolehlivost/ zachycení/ nakonec
Spolehlivost try/catch/finally
je mechanismus zpracování výjimek se stejnou úrovní záruk předvídatelnosti jako nespravovaná verze. Blok catch/finally
je CER. Metody v bloku vyžadují pokročilou přípravu a musí být nepřerušitelné.
V rozhraní .NET Framework verze 2.0 kód informuje modul runtime, že pokus je spolehlivý voláním PrepareConstrainedRegions bezprostředně před blokem try. PrepareConstrainedRegions je členem RuntimeHelperstřídy podpory kompilátoru. Volání PrepareConstrainedRegions přímo čeká na dostupnost prostřednictvím kompilátorů.
Neinterruptovatelné oblasti
Neinterruptovatelná oblast seskupí sadu instrukcí do CER.
V rozhraní .NET Framework verze 2.0, čeká na dostupnost prostřednictvím podpory kompilátoru, uživatelský kód vytvoří nepřerušitelné oblasti se spolehlivým try/catch/finally, který obsahuje prázdný blok try/catch před voláním PrepareConstrainedRegions metody.
Objekt kritické finalizátoru
Zaručuje CriticalFinalizerObject , že uvolňování paměti provede finalizační metodu. Po přidělení se finalizátor a jeho graf volání připraví předem. Metoda finalizátoru se provádí v CER a musí dodržovat všechna omezení CERs a finalizační metody.
U všech typů, ze SafeHandle kterých se dědí, a CriticalHandle je zaručeno, že se jejich finalizační metodu spustí v rámci CER. Implementujte ReleaseHandle v SafeHandle odvozených třídách, aby se spustil jakýkoli kód, který je nutný k uvolnění popisovače.
Kód není povolen v CERS
V CER nejsou povoleny následující operace:
Explicitní přidělení
Získánízámkuho
Boxu.
Přístup k vícerozměrným polím
Volání metod prostřednictvím reflexe
Kontroly zabezpečení. Neprovádějte požadavky, pouze požadavky propojení.
Získání nebo nastavení polí na transparentním proxy serveru
Serializace.
Ukazatele funkcí a delegáti.