Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 ve vyvolávání výjimek mimo běžný proces, jež by zabránily plnému provedení kódu v této oblasti. V této oblasti je uživatelský kód omezen od spuštění kódu, který by vedl k vyvolání výjimek mimo rámec. Metoda PrepareConstrainedRegions musí bezprostředně předcházet bloku try a označuje catch, finallya 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 v modulu CLR používají v různých formách, kromě bloku s poznámkou try, především kritické finalizátory ve třídách odvozených z třídy CriticalFinalizerObject a kód spouštěný pomocí metody ExecuteCodeWithGuaranteedCleanup.
Příprava předem na CER
CLR předem připraví CER, aby se předešlo nedostatku paměti. Je vyžadována důkladná příprava, aby CLR nevyvolalo stav nedostatku paměti během just-in-time kompilace nebo načítání typu.
Vývojář musí označit, že oblast kódu je CER:
Oblast CER nejvyšší úrovně a metody v úplném grafu volání, na které je aplikován atribut ReliabilityContractAttribute, jsou připraveny předem. ReliabilityContractAttribute může pouze poskytnout záruky na 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í metody ExecuteCodeWithGuaranteedCleanup by měl být atribut PrePrepareMethodAttribute aplikován na kód pro vyčištění.
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í
Boxování.
Získání zámku.
Virtuální volání nepřipravených metod.
Volání metod se slabou nebo neexistující smlouvou 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í metodě, 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í napsána tak, aby používala CER, což je ten 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. Například označení Count s
ReliabilityContractAttribute(Cer.Success)znamená, že když je spuštěn v rámci CER, vždy vrátí počet prvků v ArrayList a nikdy nemůže zanechat interní pole v nedeterminovaném stavu. Metoda CompareExchange je však označena také jako úspěšná, s pochopením, že úspěch může znamenat, že hodnota nemohla být nahrazena novou hodnotou kvůli závodní podmínce. 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ě korupce
Ú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 pouze 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 metoda nepoškodí stav.
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. Zavolejte PrepareConstrainedRegions přímo, jakmile to umožní kompilátory.
Neinterruptovatelné oblasti
Neinterruptovatelná oblast seskupí sadu instrukcí do CER.
V rozhraní .NET Framework verze 2.0, dokud není dostupná podpora kompilátorem, uživatelský kód může vytvářet nepřerušitelné oblasti pomocí spolehlivého zpracování try/catch/finally, které obsahuje prázdný blok try/catch před voláním metody PrepareConstrainedRegions.
Objekt kritického finalizátoru
Konstrukce CriticalFinalizerObject zaručuje, že uvolňování paměti provede finalizátor. Po přidělení jsou finalizátor a jeho volací graf připraveny předem. Metoda finalizátoru se provádí v CER a musí dodržovat všechna omezení CER a finalizátorů.
Jakékoli typy, které dědí z SafeHandle a CriticalHandle, mají zaručeno, že se jejich finalizační metoda spustí v rámci CER. Implementujte ReleaseHandle v odvozených třídách SafeHandle k provedení jakéhokoli kódu, který je nutný k uvolnění popisovače.
Kód není povolen v CERS
V CER nejsou povoleny následující operace:
Explicitní alokace
Získání zámku.
Boxování.
Přístup k vícerozměrným polím
Volání metod prostřednictvím reflexe
Kontroly zabezpečení. Neřešte požadavky, pouze je propojujte.
Získání nebo nastavení polí na transparentním proxy serveru
Serializace.
Ukazatele funkcí a delegáti.