Ladealgorithmus für Satellitenassemblys
Satellitenassemblys werden verwendet, um lokalisierte Ressourcen für Sprachen und Kulturen zu speichern.
Für Satellitenassemblys wird ein anderer Ladealgorithmus als für allgemeine verwaltete Assemblys verwendet.
Wann werden Satellitenassemblys geladen?
Satellitenassemblys werden beim Laden einer lokalisierten Ressource geladen.
Die grundlegende API zum Laden lokalisierter Ressourcen ist die System.Resources.ResourceManager-Klasse. Letztendlich ruft die ResourceManager-Klasse die GetSatelliteAssembly-Methode für jede CultureInfo.Name auf.
APIs auf höherer Ebene können eine API auf niedrigerer Ebene abstrahieren.
Algorithmus
Der .NET Core-Ressourcenfallbackprozess besteht aus folgenden Schritten:
Bestimmen Sie die
active
AssemblyLoadContext-Instanz. In allen Fällen handelt es sich bei deractive
-Instanz um den AssemblyLoadContext der ausführenden Assembly.Die
active
-Instanz versucht, eine Satellitenassembly für die angeforderte Kultur in folgender Reihenfolge nach Priorität zu laden:Überprüfen Sie den Cache.
Wenn
active
die AssemblyLoadContext.Default-Instanz ist, führen Sie die Logik Standardüberprüfungen von Satellitenassemblys (Ressourcen) aus.Rufen Sie die Funktion AssemblyLoadContext.Load auf.
Wenn die verwaltete Assembly, die der Satellitenassembly entspricht, aus einer Datei geladen wurde, überprüfen Sie das Verzeichnis der verwalteten Assembly auf ein Unterverzeichnis, das dem angeforderten CultureInfo.Name entspricht (z. B
es-MX
).Hinweis
Unter Linux und macOS muss beim Unterverzeichnis die Groß-/Kleinschreibung beachtet werden, und eine der folgenden Voraussetzungen muss erfüllt sein:
- Die Groß-/Kleinschreibung muss genau übereinstimmen.
- Es wurden nur Kleinbuchstaben verwendet.
Lösen Sie das AssemblyLoadContext.Resolving-Ereignis aus.
Lösen Sie das AppDomain.AssemblyResolve-Ereignis aus.
Wenn eine Satellitenassembly geladen wird:
- Das AppDomain.AssemblyLoad-Ereignis wird ausgelöst.
- Die Assembly wird nach der angeforderten Ressource durchsucht. Wenn die Runtime die Ressource in der Assembly findet, verwendet sie diese. Wenn sie die Ressource nicht findet, fährt sie mit der Suche fort.
Hinweis
Um eine Ressource in der Satellitenassembly zu finden, sucht die Runtime nach der Ressourcendatei, die vom ResourceManager für den aktuellen CultureInfo.Name angefordert wird. Sie sucht in der Ressourcendatei nach dem angeforderten Ressourcennamen. Wenn keins von beiden gefunden wird, wird die Ressource als nicht gefunden behandelt.
Als Nächstes sucht ResourceManager die übergeordneten Kulturassemblys auf vielen möglichen Ebenen, wobei jedes Mal die Schritte 2 und 3 wiederholt werden.
Jeder Kultur hat genau ein übergeordnetes Element, das von der CultureInfo.Parent-Eigenschaft definiert wird.
Die Suche nach übergeordneten Kulturen ist beendet, wenn die Parent-Eigenschaft einer Kultur CultureInfo.InvariantCulture ist.
Für die InvariantCulture werden die Schritte 2 und 3 nicht wiederholt, sondern stattdessen mit Schritt 5 fortgefahren.
Wenn die Ressource immer noch nicht gefunden wurde, verwendet ResourceManager die Ressource für die Standardkultur (Fallback).
Für gewöhnlich werden die Ressourcen der Standardkultur in die Hauptassembly der Anwendung integriert. Sie können jedoch UltimateResourceFallbackLocation.Satellite für die NeutralResourcesLanguageAttribute.Location-Eigenschaft angeben. Dieser Wert gibt an, dass der endgültige Fallbackort für Ressourcen eine Satellitenassembly ist und nicht die Hauptassembly.
Hinweis
Die Standardkultur wird als endgültiges Fallback verwendet. Daher wird empfohlen, immer einen umfassenden Satz an Ressourcen in die Standardressourcendatei zu integrieren. So werden Ausnahmen verhindert. Über diesen umfassenden Satz stellen Sie einen Fallback für alle Ressourcen bereit und stellen sicher, dass immer mindestens eine Ressource für den Benutzer verfügbar ist, auch wenn diese nicht kulturspezifisch ist.
Zum Schluss:
- Wenn die Runtime keine Ressourcendatei für eine Standardkultur (Fallback) findet, wird eine MissingManifestResourceException oder MissingSatelliteAssemblyException ausgelöst.
- Wenn die Ressourcendatei gefunden wurde, aber die angeforderte Ressource nicht vorhanden ist, gibt die Anforderung
null
zurück.