Algoritme voor het laden van satellietassembly's
Satellietassembly's worden gebruikt voor het opslaan van gelokaliseerde resources die zijn aangepast voor taal en cultuur.
Satellietassembly's gebruiken een ander laadalgoritmen dan algemene beheerde assembly's.
Wanneer worden satellietassembly's geladen?
Satellietassembly's worden geladen bij het laden van een gelokaliseerde resource.
De basis-API voor het laden van gelokaliseerde resources is de System.Resources.ResourceManager klasse. Uiteindelijk roept de ResourceManager klasse de GetSatelliteAssembly methode voor elke CultureInfo.Nameaan.
API's op een hoger niveau kunnen de API op laag niveau abstraheren.
Algoritme
Het terugvalproces voor .NET Core-resources omvat de volgende stappen:
Bepaal het
active
AssemblyLoadContext exemplaar. In alle gevallen is hetactive
exemplaar de uitvoering van de assembly AssemblyLoadContext.Het
active
exemplaar laadt een satellietassembly voor de aangevraagde cultuur in de volgende prioriteitsvolgorde:Controleer de cache.
Als
active
dit het AssemblyLoadContext.Default geval is, voert u de standaardassembly-assemblylogica (resource) uit .Roep de functie AssemblyLoadContext.Load aan.
Als de beheerde assembly die overeenkomt met de satellietassembly uit een bestand is geladen, controleert u de map van de beheerde assembly op een submap die overeenkomt met de aangevraagde CultureInfo.Name map (bijvoorbeeld
es-MX
).Notitie
In Linux en macOS is de submap hoofdlettergevoelig en moet het volgende:
- Exact identieke hoofdletters.
- Wees in kleine letters.
Hef de AssemblyLoadContext.Resolving gebeurtenis op.
Hef de AppDomain.AssemblyResolve gebeurtenis op.
Als een satellietassembly wordt geladen:
- De AppDomain.AssemblyLoad gebeurtenis wordt gegenereerd.
- De assembly wordt gezocht naar de aangevraagde resource. Als de runtime de resource in de assembly vindt, wordt deze gebruikt. Als de resource niet wordt gevonden, wordt de zoekopdracht voortgezet.
Notitie
Om een resource in de satellietassembly te vinden, zoekt de runtime naar het resourcebestand dat door de ResourceManager huidige is CultureInfo.Nameaangevraagd. In het resourcebestand wordt gezocht naar de aangevraagde resourcenaam. Als een van beide niet wordt gevonden, wordt de resource behandeld als niet gevonden.
De ResourceManager volgende zoekopdracht doorzoekt de bovenliggende cultuurassembly's door een groot aantal potentiële niveaus, telkens wanneer u stap 2 & 3 herhaalt.
Elke cultuur heeft slechts één bovenliggend element, dat wordt gedefinieerd door de CultureInfo.Parent eigenschap.
Het zoeken naar bovenliggende culturen stopt wanneer het eigendom van Parent een cultuur is CultureInfo.InvariantCulture.
Voor de InvariantCulture, gaan we niet terug naar stap 2 & 3, maar gaan we verder met stap 5.
Als de resource nog steeds niet wordt gevonden, ResourceManager wordt de resource gebruikt voor de standaardcultuur (terugval).
Normaal gesproken worden de resources voor de standaardcultuur opgenomen in de hoofdtoepassingsassembly. U kunt echter opgeven UltimateResourceFallbackLocation.Satellite voor de NeutralResourcesLanguageAttribute.Location eigenschap. Deze waarde geeft aan dat de ultieme terugvallocatie voor resources een satellietassemblage is in plaats van de hoofdassembly.
Notitie
De standaardcultuur is de ultieme terugval. Daarom raden we u aan altijd een uitgebreide set resources in het standaardresourcebestand op te nemen. Hiermee voorkomt u dat uitzonderingen worden gegenereerd. Door een volledige set te hebben, biedt u een terugval voor alle resources en zorgt u ervoor dat ten minste één resource altijd aanwezig is voor de gebruiker, zelfs als deze niet cultureel specifiek is.
Eindelijk
- Als de runtime geen resourcebestand voor een standaardcultuur (terugval) vindt, wordt er een MissingManifestResourceException of MissingSatelliteAssemblyException een uitzondering gegenereerd.
- Als het resourcebestand wordt gevonden maar de aangevraagde resource niet aanwezig is, wordt de aanvraag geretourneerd
null
.