Begränsade körningsregioner
En begränsad körningsregion (CER) är en del av en mekanism för att skapa tillförlitlig hanterad kod. En CER definierar ett område där CLR (Common Language Runtime) är begränsad från att utlösa undantag som hindrar koden i området från att köras i sin helhet. Inom den regionen begränsas användarkoden från att köra kod som skulle leda till att undantag från out-of-band utlöss. Metoden PrepareConstrainedRegions måste omedelbart föregå ett try
block och markerar catch
, finally
och fault
block som begränsade körningsregioner. När koden har markerats som en begränsad region får den bara anropa annan kod med starka tillförlitlighetskontrakt och koden bör inte allokera eller göra virtuella anrop till oförberedda eller otillförlitliga metoder såvida inte koden är beredd att hantera fel. CLR fördröjer trådens avbrutna kod som körs i en CER.
Viktigt!
CER stöds endast i .NET Framework. Den här artikeln gäller inte för .NET Core eller .NET 5 och senare.
Begränsade körningsregioner används i olika former i CLR utöver ett kommenterat try
block, särskilt kritiska finaliserare som körs i klasser som härleds från CriticalFinalizerObject klassen och koden som körs med hjälp av ExecuteCodeWithGuaranteedCleanup metoden.
CER-förhandsförberedelse
CLR förbereder cers i förväg för att undvika minnesbrist. Förhandsförberedelse krävs så att CLR inte orsakar minnesbrist vid just-in-time-kompilering eller typinläsning.
Utvecklaren måste ange att en kodregion är en CER:
Cer-regionen och metoderna på den översta nivån i det fullständiga anropsdiagrammet som har attributet ReliabilityContractAttribute tillämpat förbereds i förväg. Kan ReliabilityContractAttribute bara ange garantier för Success eller MayFail.
Förhandsförberedelser kan inte utföras för anrop som inte kan fastställas statiskt, till exempel virtuell sändning. PrepareMethod Använd metoden i dessa fall. När du använder ExecuteCodeWithGuaranteedCleanup metoden PrePrepareMethodAttribute ska attributet tillämpas på rensningskoden.
Krav
Användarna är begränsade till den typ av kod som de kan skriva i en CER. Koden kan inte orsaka ett out-of-band-undantag, till exempel på grund av följande åtgärder:
Explicit allokering.
Boxning.
Hämtar ett lås.
Anropar oförberedda metoder praktiskt taget.
Anropa metoder med ett svagt eller obefintligt tillförlitlighetskontrakt.
I .NET Framework version 2.0 är dessa begränsningar riktlinjer. Diagnostik tillhandahålls via verktyg för kodanalys.
Tillförlitlighetskontrakt
ReliabilityContractAttribute är ett anpassat attribut som dokumenterar tillförlitlighetsgarantierna och skadade tillstånd för en viss metod.
Tillförlitlighetsgarantier
Tillförlitlighetsgarantier, som representeras av Cer uppräkningsvärden, anger graden av tillförlitlighet för en viss metod:
MayFail. Under exceptionella förhållanden kan metoden misslyckas. I det här fallet rapporterar metoden tillbaka till anropande metod oavsett om den lyckades eller misslyckades. Metoden måste finnas i en CER för att säkerställa att den kan rapportera returvärdet.
None. Metoden, typen eller sammansättningen har inget koncept för en CER och är sannolikt inte säker att anropa inom en CER utan betydande minskning från skada på tillståndet. Den drar inte nytta av CER-garantier. Detta innebär följande:
Under exceptionella förhållanden kan metoden misslyckas.
Metoden kanske eller kanske inte rapporterar att den misslyckades.
Metoden är inte skriven för att använda en CER, det mest sannolika scenariot.
Om en metod, typ eller sammansättning inte uttryckligen identifieras som lyckades identifieras den implicit som None.
Success. Under exceptionella förhållanden är metoden garanterad att lyckas. För att uppnå den här nivån av tillförlitlighet bör du alltid skapa en CER runt metoden som anropas, även när den anropas inifrån en icke-CER-region. En metod lyckas om den utför det som är avsett, även om framgång kan ses subjektivt. Om du till exempel markerar Antal med
ReliabilityContractAttribute(Cer.Success)
innebär det att när det körs under en CER returnerar det alltid ett antal element i ArrayList och det kan aldrig lämna de interna fälten i ett obestämt tillstånd. Metoden markeras dock CompareExchange också som framgångsrik, med insikten att framgång kan innebära att värdet inte kunde ersättas med ett nytt värde på grund av ett konkurrenstillstånd. Den viktigaste punkten är att metoden beter sig på det sätt som den dokumenteras för att fungera, och CER-kod behöver inte skrivas för att förvänta sig något ovanligt beteende utöver hur korrekt men opålitlig kod skulle se ut.
Korruptionsnivåer
Korruptionsnivåer, som representeras av Consistency uppräkningsvärden, anger hur mycket tillstånd som kan skadas i en viss miljö:
MayCorruptAppDomain. Under exceptionella förhållanden ger CLR (Common Language Runtime) inga garantier för tillståndskonsekvens i den aktuella programdomänen.
MayCorruptInstance. Under exceptionella förhållanden garanteras metoden att begränsa skadade tillstånd till den aktuella instansen.
MayCorruptProcess, Under exceptionella förhållanden ger CLR inga garantier när det gäller tillståndskonsekvens. Villkoret kan skada processen.
WillNotCorruptState. Under exceptionella förhållanden garanteras metoden att inte skada tillståndet.
Tillförlitlighets-try/catch/finally
Tillförlitligheten try/catch/finally
är en mekanism för undantagshantering med samma nivå av förutsägbarhetsgarantier som den ohanterade versionen. Blocket catch/finally
är CER. Metoder i blocket kräver förberedelse i förväg och måste vara icke-avbrottsbara.
I .NET Framework version 2.0 informerar koden körningen om att ett försök är tillförlitligt genom att anropa PrepareConstrainedRegions omedelbart före ett försöksblock. PrepareConstrainedRegions är medlem i RuntimeHelpers, en stödklass för kompilatorn. Anropa PrepareConstrainedRegions direkt i väntan på dess tillgänglighet via kompilatorer.
Icke-avbrottsbara regioner
En icke-avbrottsbar region grupperar en uppsättning instruktioner i en CER.
I .NET Framework version 2.0, i väntan på tillgänglighet via kompilatorstöd, skapar användarkod icke-avbrottsbara regioner med ett tillförlitligt try/catch/finally som innehåller ett tomt try/catch-block som föregås av ett PrepareConstrainedRegions metodanrop.
Kritiskt finalatorobjekt
En CriticalFinalizerObject garanti för att skräpinsamlingen kör slutföraren. Vid allokering förbereds finaliseraren och dess anropsdiagram i förväg. Finalizer-metoden körs i en CER och måste följa alla begränsningar för CER och finalizers.
Alla typer som ärver från SafeHandle och CriticalHandle garanteras att deras finalizer körs inom en CER. Implementera ReleaseHandle i SafeHandle härledda klasser för att köra all kod som krävs för att frigöra handtaget.
Kod tillåts inte i CER
Följande åtgärder är inte tillåtna i CER:erna:
Explicita allokeringar.
Hämtar ett lås.
Boxning.
Flerdimensionell matrisåtkomst.
Metoden anropar genom reflektion.
Säkerhetskontroller. Utför inte krav, bara länkkrav.
Hämta eller ange fält på en transparent proxy.
Serialization.
Funktionspekare och ombud.