Algoritmo di caricamento dell'assembly satellite
Gli assembly satellite vengono usati per archiviare le risorse localizzate personalizzate per lingua e impostazioni cultura.
Gli assembly satellite usano un algoritmo di caricamento diverso rispetto agli assembly gestiti generali.
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:
Determinare l'istanza
active
AssemblyLoadContext. In tutti i casi, l'istanzaactive
è il AssemblyLoadContext dell’assembly in esecuzione.L'istanza
active
carica un assembly satellite per le impostazioni cultura richieste nell'ordine di priorità seguente:Controllare la cache.
Se
active
è l'istanza AssemblyLoadContext.Default, eseguire la logica di probe 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
In Linux e macOS la sottodirectory fa distinzione tra maiuscole e minuscole e deve:
- Avere una corrispondenza esatta di maiuscole e minuscole.
- Essere in minuscolo.
Generare l'evento AssemblyLoadContext.Resolving.
Generare l'evento AppDomain.AssemblyResolve.
Se viene caricato un assembly satellite:
- Viene generato l'evento AppDomain.AssemblyLoad.
- L'assembly viene cercato la risorsa richiesta. Se il runtime trova la risorsa nell'assembly la usa direttamente. In caso contrario la ricerca continua.
Nota
Per trovare una risorsa all'interno dell'assembly satellite, il runtime cerca il file di risorse richiesto da ResourceManager per la proprietà CultureInfo.Name corrente. 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.
Il ResourceManager cerca quindi gli assembly di impostazioni cultura padre su molti livelli potenziali, ripetendo ogni ora i passaggi 2 e 3.
Le impostazioni cultura hanno solo un elemento padre, che viene definito dalla proprietà CultureInfo.Parent.
La ricerca di impostazioni cultura padre si arresta quando la proprietà Parent di un set di impostazioni cultura è CultureInfo.InvariantCulture.
Per InvariantCulture, non torniamo ai passaggi 2 e 3, ma continuiamo con il passaggio 5.
Se la risorsa ancora non viene trovata, ResourceManager usa la risorsa per le impostazioni cultura predefinite (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 finale di fallback per le risorse è un assembly satellite anziché l'assembly principale.
Nota
Le impostazioni cultura predefinite sono il fallback finale. È quindi consigliabile includere sempre un set completo di risorse nel file di risorse predefinito. Ciò evita la generazione di eccezioni. Se si include un set completo, si offre un fallback per tutte le risorse e si garantisce che l'utente disponga di almeno una risorsa, anche se questa non è specifica per le impostazioni cultura.
Infine,
- se il runtime non trova un file di risorse per impostazioni cultura predefinite (fallback), viene generata un'eccezione MissingManifestResourceException o MissingSatelliteAssemblyException.
- Se il file di risorse viene trovato ma la risorsa richiesta non è presente, la richiesta restituisce
null
.