Recupero di risorse in assembly satellite

La procedura ideale consiste nel creare il package delle risorse relative all'assembly predefinito o neutro con l'assembly principale e creare un assembly satellite separato per ciascuna lingua supportata dall'applicazione. La classe ResourceManager fornisce l'accesso alle risorse specifiche della lingua in fase di esecuzione e controlla come le risorse vengono recuperate dall'applicazione tramite il processo di fallback delle risorse. Per ulteriori informazioni, vedere la sezione "Processo di fallback delle risorse" nell'argomento Creazione del package e distribuzione delle risorse. È opportuno accedere alle risorse mediante uno dei costruttori della classe ResourceManager. In tal caso è necessario che le risorse siano compilate negli assembly satellite o facciano parte dell'assembly principale dell'applicazione.

ResourceManager determina le risorse da recuperare in base alla proprietà CultureInfo.CurrentUICulture del thread corrente. Se ad esempio un'applicazione viene compilata con le risorse predefinite in lingua inglese e con due assembly satellite contenenti le risorse per le lingue francese e tedesco e la proprietà CurrentUICulture è impostata su "de", ResourceManager recupererà le risorse in tedesco. Per ulteriori informazioni su come impostare la proprietà CurrentUICulture, vedere Uso della proprietà CurrentUICulture.

Nell'esempio riportato di seguito viene utilizzato il metodo ResourceManager.GetString per recuperare e visualizzare una risorsa di tipo stringa.

…
Dim private rm As ResourceManager
rm = New ResourceManager("MyStrings", Me.GetType().Assembly)
Console.Writeline(rm.GetString("string1"))
…
…
private ResourceManager rm;
rm = new ResourceManager("MyStrings", this.GetType().Assembly);
Console.Writeline(rm.GetString("string1"));
…

Il codice recupera e visualizza string1 dal file MyStrings. La stringa che viene effettivamente caricata dipende dalla proprietà CurrentUICulture del thread corrente.

Nell'esempio riportato di seguito viene utilizzato il metodo ResourceManager.GetObject per recuperare e visualizzare una risorsa binaria, ad esempio un'immagine.

…
Dim private rm As ResourceManager
rm = New ResourceManager("MyImages", Me.GetType().Assembly)
PictureBox.Image = Ctype(rm.GetObject("MyObject"), System.Drawing.Image)
…
…
private ResourceManager rm;
rm = new ResourceManager("MyImages", this.GetType().Assembly);
PictureBox.Image = (System.Drawing.Image)rm.GetObject("MyObject");
…

Nel codice sopra riportato viene caricato l'oggetto denominato MyObject dal file di risorse MyImages. Viene quindi eseguito il cast di MyObject in un tipo Image. L'oggetto viene poi assegnato alla proprietà Image di PictureBox. L'oggetto che viene effettivamente caricato dipende dalla proprietà CurrentUICulture del thread corrente.

La classe ResourceSet archivia tutte le risorse localizzate per una singola lingua. ResourceSet non si avvale del processo di fallback delle risorse. Pertanto, l'uso di ResourceSet non è indicato nelle applicazioni localizzate.

Supporto per il controllo delle versioni degli assembly satellite

Per impostazione predefinita, quando ResourceManager recupera le risorse richieste, cerca assembly satellite i cui numeri di versione corrispondano a quello dell'assembly principale. Una volta distribuita un'applicazione, è possibile che si desideri aggiornare l'assembly principale o gli assembly satellite di risorse specifiche. .NET Framework offre supporto per il controllo delle versioni dell'assembly principale e degli assembly satellite.

La classe SatelliteContractVersionAttribute fornisce supporto per il controllo delle versioni di un assembly principale. La specifica di SatelliteContractVersionAttribute per l'assembly principale di un'applicazione consente di aggiornare e ridistribuire un assembly principale senza aggiornare i relativi assembly satellite. Una volta aggiornato l'assembly principale, incrementare il numero di versione dell'assembly principale, ma lasciare inalterato il numero di versione del contratto con i satelliti. Per recuperare le risorse richieste, ResourceManager caricherà la versione di assembly satellite specificata da questo attributo.

Gli assembly di criteri dell'editore forniscono il supporto per il controllo delle versioni degli assembly satellite. È possibile aggiornare e ridistribuire un assembly satellite senza aggiornare l'assembly principale. Una volta aggiornato un assembly satellite, incrementarne il numero di versione e fornirlo con un assembly di criteri dell'editore. Nell'assembly di criteri dell'editore specificare che il nuovo assembly satellite è compatibile con le versioni precedenti. Sebbene ResourceManager utilizzerà il numero di versione del contratto esistente dell'assembly principale per recuperare le risorse richieste, verrà egualmente recuperata la versione aggiornata corretta dell'assembly, perché il caricatore dell'assembly consentirà di effettuare l'associazione alla versione dell'assembly satellite specificata nell'assembly di criteri dell'editore. Per ulteriori informazioni sugli assembly di criteri dell'editore, vedere Creazione di un file dei criteri editore.

Per attivare il supporto completo del controllo delle versioni, si consiglia di distribuire gli assembly con nome sicuro nella Global Assembly Cache e gli assembly senza nome sicuro nella directory dell'applicazione. Se si desidera distribuire gli assembly con nome sicuro nella directory dell'applicazione, non sarà possibile incrementare il numero di versione di un assembly satellite quando si aggiorna l'assembly. Sarà necessario, invece, eseguire un aggiornamento sul posto quando il codice esistente verrà sostituito dal codice aggiornato e mantenere lo stesso numero di versione. Se, ad esempio, si desidera aggiornare la versione 1.0.0.0 di un assembly satellite con il nome assembly completo "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", sovrascriverlo con il file myApp.resources.dll aggiornato compilato con lo stesso nome assembly completo "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Non è possibile incrementare il numero di versione, pertanto l'utilizzo degli aggiornamenti sul posto dei file assembly satellite rende difficile la determinazione accurata da parte dell'applicazione della versione di un assembly satellite.

Per ulteriori informazioni sul controllo delle versioni degli assembly, vedere Controllo delle versioni degli assembly e Come il runtime individua gli assembly.

Vedere anche

Riferimenti

ResourceManager Class

Concetti

Risorse nelle applicazioni
Creazione del package e distribuzione delle risorse
Come il runtime individua gli assembly
Recupero di risorse in file RESOURCES