Condividi tramite


Algoritmo di caricamento dell'assemblaggio satellite

Gli assembly satellite vengono usati per archiviare le risorse localizzate personalizzate per lingua e cultura.

Gli assembly satelliti utilizzano un algoritmo di caricamento diverso rispetto agli assembly gestiti in generale.

Quando vengono caricati gli assembly satellite?

Gli assembly satellite vengono caricati durante il caricamento di una risorsa localizzata.

L'API di base per caricare le risorse localizzate è la classe System.Resources.ResourceManager. In definitiva, la classe ResourceManager chiamerà il metodo GetSatelliteAssembly per ogni CultureInfo.Name.

Le API di livello superiore possono astrarre l'API di basso livello.

Algoritmo

Il processo di fallback per le risorse di .NET Core include i passaggi seguenti:

  1. Determinare l'istanza activeAssemblyLoadContext. In tutti i casi, l'istanza active è il AssemblyLoadContext dell’assembly in esecuzione.

  2. L'istanza active carica un assembly satellite per la cultura richiesta nel seguente ordine di priorità:

    • Controllare la cache.

    • Se active è l'istanza AssemblyLoadContext.Default, eseguire la logica di ricerca dell'assembly satellite (risorsa) predefinita.

    • Chiamare la funzione AssemblyLoadContext.Load.

    • Se l'assembly gestito corrispondente all'assembly satellite è stato caricato da un file, controllare la directory dell'assembly gestito per trovare una sottodirectory corrispondente all'assembly richiesto CultureInfo.Name, ad esempio es-MX.

      Nota

      Sui sistemi Linux e macOS, la sottodirectory fa distinzione tra maiuscole e minuscole e deve:

      • Corrispondenza esatta delle maiuscole e minuscole.
      • Essere in lettere minuscole.
    • Generare l'evento AssemblyLoadContext.Resolving.

    • Generare l'evento AppDomain.AssemblyResolve.

  3. Se un assembly satellite viene caricato:

    • Viene generato l'evento AppDomain.AssemblyLoad.
    • Nell'assembly si cerca la risorsa richiesta. Se il runtime trova la risorsa nell'assembly la usa direttamente. Se non trova la risorsa, la ricerca continua.

    Nota

    Per trovare una risorsa all'interno dell'assembly satellite, il runtime cerca il file di risorse richiesto da ResourceManager per il contesto corrente CultureInfo.Name. All'interno del file di risorse, cerca il nome della risorsa richiesta. Se uno dei due non viene trovato, la risorsa viene considerata come non trovata.

  4. Il ResourceManager successivamente cerca gli assembly di impostazioni cultura padre su molti livelli potenziali, ripetendo ogni volta i passaggi 2 e 3.

    Ogni cultura ha solo un genitore, che è definito dalla proprietà CultureInfo.Parent.

    La ricerca delle culture padre si arresta quando la proprietà di una cultura è CultureInfo.InvariantCulture.

    Per InvariantCulture, non torniamo ai passaggi 2 e 3, ma continuiamo con il passaggio 5.

  5. Se la risorsa non viene ancora trovata, ResourceManager usa la risorsa per la cultura predefinita (fallback).

    In genere le risorse delle impostazioni cultura predefinite sono incluse nell'assembly principale dell'applicazione. Tuttavia, è possibile specificare UltimateResourceFallbackLocation.Satellite per la proprietà NeutralResourcesLanguageAttribute.Location. Questo valore indica che la posizione di fallback finale per le risorse è un assembly satellitare anziché l'assembly principale.

    Nota

    La cultura predefinita è l'ultimo ripiego. È quindi consigliabile includere sempre un set completo di risorse nel file di risorse predefinito. Ciò aiuta a evitare che le eccezioni vengano sollevate. Includendo un set completo, si offre una soluzione di riserva per tutte le risorse e si garantisce che l'utente disponga di almeno una risorsa, anche se questa non è culturalmente specifica.

  6. Infine,