Dela via


Begränsade utförandeområden

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 utanför vanliga mekanismer utlöses. Metoden PrepareConstrainedRegions måste omedelbart föregå ett try block och markerar catch, finallyoch 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 avbrytning av trådar för 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:

Begränsningar

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

  • 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 korruptionstillståndet 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 åtgärder mot statuskorruption. Den drar inte nytta av CER-garantier. Detta innebär följande:

    1. Under exceptionella förhållanden kan metoden misslyckas.

    2. Metoden kanske inte rapporterar att den misslyckades, eller så gör den det.

    3. Metoden är inte skriven för att använda en CER, det mest sannolika scenariot.

    4. Om en metod, typ eller sammansättning inte uttryckligen identifieras som att lyckas, 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 status som kan förändras i en specifik 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 korruption av 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örlitlighet (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 och måste vara utan avbrott.

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 garanterar att skräpinsamlingen kör slutmetoden. 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.

  • Enter eller Lock.

  • Säkerhetskontroller. Utför inte krav, bara länkkrav.

  • Isinst och Castclass för COM-objekt och proxyservrar

  • Hämta eller ange fält på en transparent proxy.

  • Serialisering.

  • Funktionspekare och delegater.

Se även