Delen via


Beperkte uitvoeringsregio's

Een beperkte uitvoeringsregio (CER) maakt deel uit van een mechanisme voor het ontwerpen van betrouwbare beheerde code. Een CER definieert een gebied waarin de COMMON Language Runtime (CLR) wordt beperkt tot het weggooien van out-of-band-uitzonderingen die verhinderen dat de code in het gebied volledig wordt uitgevoerd. Binnen die regio wordt gebruikerscode beperkt tot het uitvoeren van code die zou leiden tot het genereren van out-of-band-uitzonderingen. De PrepareConstrainedRegions methode moet direct voorafgaan aan een try blok en markeringencatchfinally, en fault blokken als beperkte uitvoeringsregio's. Zodra code is gemarkeerd als een beperkt gebied, moet code alleen andere code aanroepen met sterke betrouwbaarheidscontracten en mag code geen virtuele aanroepen toewijzen of maken van virtuele aanroepen naar niet-voorbereide of onbetrouwbare methoden, tenzij de code is voorbereid om fouten af te handelen. De CLR vertraagt threads voor code die wordt uitgevoerd in een CER.

Belangrijk

CER wordt alleen ondersteund in .NET Framework. Dit artikel is niet van toepassing op .NET Core of .NET 5 en hoger.

Beperkte uitvoeringsregio's worden in verschillende vormen in de CLR gebruikt, naast een geannoteerd try blok, met name kritieke finalizers die worden uitgevoerd in klassen die zijn afgeleid van de CriticalFinalizerObject klasse en code die met behulp van de ExecuteCodeWithGuaranteedCleanup methode worden uitgevoerd.

CER Advance Preparation

De CLR bereidt CER vooraf voor om onvoldoende geheugen te voorkomen. Voorvoorbereiding is vereist, zodat de CLR geen geheugenvoorwaarde veroorzaakt tijdens just-in-time compilatie of het laden van het type.

De ontwikkelaar is vereist om aan te geven dat een coderegio een CER is:

Beperkingen

Gebruikers zijn beperkt in het type code dat ze kunnen schrijven in een CER. De code kan geen out-of-band-uitzondering veroorzaken, zoals het gevolg van de volgende bewerkingen:

  • Expliciete toewijzing.

  • Boksen.

  • Een slot verkrijgen.

  • Niet-voorbereide methoden virtueel aanroepen.

  • Methoden aanroepen met een zwak of niet-bestaand betrouwbaarheidscontract.

In .NET Framework versie 2.0 zijn deze beperkingen richtlijnen. Diagnostische gegevens worden geleverd via hulpprogramma's voor codeanalyse.

Betrouwbaarheidscontracten

Het ReliabilityContractAttribute is een aangepast kenmerk dat de betrouwbaarheidsgaranties en de beschadigingsstatus van een bepaalde methode documenteert.

Betrouwbaarheidsgaranties

Betrouwbaarheidsgaranties, vertegenwoordigd door Cer opsommingswaarden, geven de mate van betrouwbaarheid van een bepaalde methode aan:

  • MayFail. Onder uitzonderlijke omstandigheden kan de methode mislukken. In dit geval rapporteert de methode terug aan de aanroepende methode, ongeacht of deze is geslaagd of mislukt. De methode moet zijn opgenomen in een CER om ervoor te zorgen dat deze de retourwaarde kan rapporteren.

  • None. De methode, het type of de assembly heeft geen concept van een CER en is waarschijnlijk niet veilig om binnen een CER aan te roepen zonder aanzienlijke beperking van statusbeschadiging. Het profiteert niet van CER-garanties. Dit impliceert het volgende:

    1. Onder uitzonderlijke omstandigheden kan de methode mislukken.

    2. De methode rapporteert mogelijk of niet dat deze is mislukt.

    3. De methode is niet geschreven om een CER te gebruiken, het meest waarschijnlijke scenario.

    4. Als een methode, type of assembly niet expliciet wordt geïdentificeerd om te slagen, wordt deze impliciet geïdentificeerd als None.

  • Success. Onder uitzonderlijke omstandigheden slaagt de methode gegarandeerd. Als u dit betrouwbaarheidsniveau wilt bereiken, moet u altijd een CER samenstellen rond de methode die wordt aangeroepen, zelfs wanneer deze wordt aangeroepen vanuit een niet-CER-regio. Een methode is geslaagd als deze bereikt wat bedoeld is, hoewel succes subjectief kan worden bekeken. Het aantal markeringen met ReliabilityContractAttribute(Cer.Success) impliceert bijvoorbeeld dat wanneer het wordt uitgevoerd onder een CER, het altijd een telling retourneert van het aantal elementen in de ArrayList en dat de interne velden nooit in een onbepaalde staat kunnen blijven. De CompareExchange methode wordt echter ook gemarkeerd als geslaagd, met het begrip dat succes kan betekenen dat de waarde niet kan worden vervangen door een nieuwe waarde vanwege een racevoorwaarde. Het belangrijkste punt is dat de methode zich gedraagt op de manier waarop deze wordt gedocumenteerd om zich te gedragen, en CER-code hoeft niet te worden geschreven om ongebruikelijk gedrag te verwachten dat verder gaat dan de juiste maar onbetrouwbare code eruit zou zien.

Beschadigingsniveaus

Beschadigingsniveaus, vertegenwoordigd door Consistency opsommingswaarden, geven aan hoeveel status mogelijk beschadigd is in een bepaalde omgeving:

  • MayCorruptAppDomain. Onder uitzonderlijke omstandigheden biedt de Common Language Runtime (CLR) geen garanties met betrekking tot statusconsistentie in het huidige toepassingsdomein.

  • MayCorruptInstance. Onder uitzonderlijke omstandigheden wordt gegarandeerd dat de statusbeschadiging wordt beperkt tot het huidige exemplaar.

  • MayCorruptProcess, onder uitzonderlijke omstandigheden maakt de CLR geen garanties met betrekking tot staatsconsistentie; Dat wil gezegd, de voorwaarde kan het proces beschadigen.

  • WillNotCorruptState. Onder uitzonderlijke omstandigheden is de methode gegarandeerd niet beschadigd.

Betrouwbaarheid try/catch/finally

De betrouwbaarheid try/catch/finally is een mechanisme voor het afhandelen van uitzonderingen met hetzelfde niveau van voorspelbaarheidsgaranties als de onbeheerde versie. Het catch/finally blok is de CER. Methoden in het blok vereisen voorafgaande voorbereiding en moeten niet-onderbreekbaar zijn.

In .NET Framework versie 2.0 informeert code de runtime dat een poging betrouwbaar is door direct voorafgaand aan een try-blok aan te roepen PrepareConstrainedRegions . PrepareConstrainedRegions is lid van RuntimeHelpers, een compiler-ondersteuningsklasse. Roep PrepareConstrainedRegions rechtstreeks de beschikbaarheid ervan aan via compilers.

Niet-onderbreekbare regio's

Een niet-onderbreekbare regio groepeert een set instructies in een CER.

In .NET Framework versie 2.0, in afwachting van beschikbaarheid via compilerondersteuning, maakt gebruikerscode niet-onderbrekende regio's met een betrouwbare try/catch/finally die een leeg try/catch-blok bevat dat voorafgaat door een PrepareConstrainedRegions methodeaanroep.

Kritiek Finalizer-object

Een CriticalFinalizerObject garantie dat garbagecollection de finalizer uitvoert. Na toewijzing worden de finalizer en de aanroepgrafiek vooraf voorbereid. De finalizer-methode wordt uitgevoerd in een CER en moet voldoen aan alle beperkingen voor CER's en finalizers.

Alle typen die overnemen van SafeHandle en CriticalHandle zijn gegarandeerd dat hun finalizer wordt uitgevoerd binnen een CER. Implementeer ReleaseHandle in SafeHandle afgeleide klassen om code uit te voeren die nodig is om de ingang vrij te maken.

Code is niet toegestaan in CER's

De volgende bewerkingen zijn niet toegestaan in CER's:

  • Expliciete toewijzingen.

  • Een slot verkrijgen.

  • Boksen.

  • Multidimensionale matrixtoegang.

  • Methode-aanroepen via reflectie.

  • Enter of Lock.

  • Beveiligingscontroles. Voer geen eisen uit, alleen koppelingsvereisten.

  • Isinst en Castclass voor COM-objecten en proxy's

  • Velden ophalen of instellen op een transparante proxy.

  • Serialization.

  • Functiepointers en gemachtigden.

Zie ook