Freigeben über


Ladealgorithmus für Satellitenbaugruppen

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 Satellitenassemblies 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:

  1. Bestimmen Sie die activeAssemblyLoadContext-Instanz. In allen Fällen handelt es sich bei der active-Instanz um den AssemblyLoadContext der ausführenden Assembly.

  2. 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 Standardlogik der Satellitenassembly-Überprüfung 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ß- und Kleinschreibung muss genau übereinstimmen.
      • In Kleinbuchstaben schreiben.
    • Lösen Sie das AssemblyLoadContext.Resolving-Ereignis aus.

    • Lösen Sie das AppDomain.AssemblyResolve-Ereignis aus.

  3. Wenn eine Satellitenbaugruppe 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.

  4. Als Nächstes durchsucht ResourceManager die übergeordneten Kulturassemblies 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.

  5. 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 ist der endgültige Rückgriff. Daher wird empfohlen, immer einen umfassenden Satz an Ressourcen in die Standardressourcendatei zu integrieren. So werden Ausnahmen verhindert. Durch einen vollständigen Satz stellen Sie eine Auffanglösung für alle Ressourcen bereit und sorgen dafür, dass immer mindestens eine Ressource für den Anwender verfügbar ist, auch wenn diese nicht kulturspezifisch ist.

  6. Zum Schluss:

    • Wenn zur Laufzeit keine Ressourcendatei für eine Standard-(Fallback)-Kultur gefunden wird, wird eine MissingManifestResourceException- oder MissingSatelliteAssemblyException-Exception ausgelöst.
    • Wenn die Ressourcendatei gefunden wurde, aber die angeforderte Ressource nicht vorhanden ist, gibt die Anforderung null zurück.