Sdílet prostřednictvím


Oblasti omezeného spouště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 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:

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í:

    1. Za výjimečných podmínek může metoda selhat.

    2. Metoda může nebo nemusí nahlásit, že selhala.

    3. Metoda není napsána tak, aby používala CER, což je ten nejpravděpodobnější scénář.

    4. 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

  • Enter nebo Lock.

  • Kontroly zabezpečení. Neřešte požadavky, pouze je propojujte.

  • Isinst a Castclass pro objekty a proxy modelu COM

  • Získání nebo nastavení polí na transparentním proxy serveru

  • Serializace.

  • Ukazatele funkcí a delegáti.

Viz také