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 markeringencatch
finally
, 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:
De CER-regio en -methoden op het hoogste niveau in de volledige aanroepgrafiek waarop het ReliabilityContractAttribute kenmerk is toegepast, worden vooraf voorbereid. De ReliabilityContractAttribute kan alleen staatsgaranties van Success of MayFail.
De voorbereiding kan niet worden uitgevoerd voor aanroepen die niet statisch kunnen worden bepaald, zoals virtuele verzending. Gebruik de PrepareMethod methode in deze gevallen. Wanneer u de ExecuteCodeWithGuaranteedCleanup methode gebruikt, moet het PrePrepareMethodAttribute kenmerk worden toegepast op de opschoningscode.
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:
Onder uitzonderlijke omstandigheden kan de methode mislukken.
De methode rapporteert mogelijk of niet dat deze is mislukt.
De methode is niet geschreven om een CER te gebruiken, het meest waarschijnlijke scenario.
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.
Beveiligingscontroles. Voer geen eisen uit, alleen koppelingsvereisten.
Velden ophalen of instellen op een transparante proxy.
Serialization.
Functiepointers en gemachtigden.