Risorse di tipo stringa

Per creare risorse di tipo stringa, è sufficiente eseguire le tre operazioni riportate di seguito:

  1. Creare un file di testo contenente una voce nome/valore per ogni stringa.

  2. Convertire il file di testo in un file RESOURCES utilizzando Resgen.exe.

  3. Creare una DLL e incorporare il file RESOURCES utilizzando lo strumento Assembly Linker (AL) o uno dei compilatori di linguaggio forniti con .NET Framework SDK.

    **Nota   **Per ulteriori informazioni sullo strumento AL, vedere l'Appendice B: strumenti delle risorse.

Se le stringhe sono localizzate in lingue non predefinite, è necessario eseguire le tre operazioni appena descritte per ciascuna delle lingue oltre che per una lingua predefinita e non associata ad alcun paese. È necessario anche specificare la lingua quando si utilizza AL.

Listato 1. File di testo di stringhe di esempio (MyStrings.txt)

; Sample strings for the calculator – Default locale
;
Math_Greeting = Welcome – Integer Calculator
Math_Formula_Label = Formula and Results:
Math_Clear_Button = Clear
Math_Calc_Button = Calculate
Math_Calc_Error = Invalid Formula. Please try again.

Resgen.exe esegue la conversione tra i tre formati di file di risorse: stringhe (file TXT), risorse XML (file RESX) e compilati (file RESOURCES). Per compilare il file di risorse MyStrings.txt, utilizzare la riga di comando riportata di seguito per generare un file compilato intermedio contenente più risorse:

resgen MyStrings.txt MyStrings.resources

A questo punto sono disponibili tre opzioni di creazione del package: incorporare le risorse nell'assembly dell'eseguibile, creare assembly satellite che contengono le risorse oppure lasciare le risorse nel file RESOURCES e accedervi direttamente. L'ultima opzione risulta particolarmente utile per gli strumenti. Le applicazioni reali devono utilizzare gli assembly per usufruire dei vantaggi della firma e del controllo delle versioni.

Per molte applicazioni, soprattutto quelle non localizzate, è sufficiente incorporare le risorse nell'assembly eseguibile. Questa operazione viene eseguita in fase di compilazione utilizzando l'opzione /res e la sintassi seguente:

(csc|vbc) ... /out:WorldCalc.exe /res:MyStrings.resources WorldCalc.cs

**Nota   **Per maggiore chiarezza, i parametri /target, /addmodule, /a e /r sono stati omessi dalla riga precedente.

Nella riga di comando precedente WorldCalc.cs viene compilato in WorldCalc.exe e le risorse vengono incorporate dal file MyStrings.resources. Se si desidera inserire le risorse in una DLL separata, è possibile utilizzare una riga di comando simile a quella che segue:

al /out:WorldCalc.Resources.DLL /embed:MyStrings.resources,MyStrings.resources,Private

Il parametro /embed utilizza la seguente sintassi:

/embed:<filename>[,<name>[,Private]

I parametri sono descritti nella tabella riportata di seguito.

  • <filename>: il nome del file RESOURCES.

  • <name>: il nome interno delle risorse. Generalmente utilizzato nella costruzione di una ResourceManager. Di solito include uno spazio dei nomi.

  • Private: indica se le risorse sono visibili ad altri assembly. L'impostazione predefinita è no.

    **Nota   **È possibile utilizzare il parametro /link anziché /embed. In questo modo viene generata la DLL dell'assembly delle risorse, contenente il manifesto, ma viene anche incluso un collegamento al file RESOURCES anziché incorporare le risorse stesse.

Creazione di risorse tramite codice

È possibile utilizzare il codice per creare direttamente file RESOURCES. Questa tecnica risulta utile nell'automazione della generazione di risorse formattate in modo appropriato, in particolare quando le risorse sono memorizzate in un database o ne è stata effettuata la migrazione da un altro sistema, ad esempio un sistema che utilizza tabelle di risorse di tipo stringa Win32. Per creare un file RESOURCES, creare una ResourceWriter con un nome file univoco, chiamare AddResource almeno una volta e chiamare Close, che implicitamente chiama a sua volta Generate, per chiudere il file. Nel piccolo programma riportato di seguito viene illustrato l'utilizzo di una ResourceWriter per creare un file RESOURCES con cinque voci.

Listato 2a. Creazione e lettura di file RESOURCE (ResWrite.cs)

using System;
using System.Collections;
using System.Resources;

class MainApp {
   public static void Main() {
      // First create the resource file and add strings.
      IResourceWriter rw = new ResourceWriter("sample.resources");
      rw.AddResource("test1", "one");
      rw.AddResource("test2", "two");
      rw.AddResource("test3", "three");
      rw.AddResource("test4", "four");
      rw.AddResource("test5", 512341234);
      rw.Close();
      ...
   }
}

Listato 2b. Creazione e lettura di file RESOURCES (ResWrite.vb)

Imports System
Imports System.Collections
Imports System.Resources

Class MainApp
    
   Public Shared Sub Main()
      ' First create the resource file and add strings.
      Dim rw As ResourceWriter = New ResourceWriter("sample.resources")
      rw.AddResource("test1", "one")
      rw.AddResource("test2", "two")
      rw.AddResource("test3", "three")
      rw.AddResource("test4", "four")
      rw.AddResource("test5", 512341234)
      rw.Close()
      ...
   End Sub
End Class

**Nota   **È necessario assegnarlo a una IResourceWriter per far sì che il codice possa continuare a funzionare con altre classi ResourceWriter che supportano le stesse interfacce.

Il modo più semplice per recuperare le risorse da un file consiste nello scorrerle utilizzando la classe ResourceReader. Partendo dal codice precedente, il codice minimo necessario per enumerare le risorse scritte, tratto dagli stessi file di programma ResWrite.cs e ResWrite.vb,è il seguente:

Listato 3a. Iterazione di ResourceReader (ResWrite.cs)

      ...
      // Iterate through the resources.
      IResourceReader rr = new ResourceReader("sample.resources");
      IDictionaryEnumerator de = rr.GetEnumerator();
      while (de.MoveNext()) {
            Console.WriteLine(de.Key + " " + de.Value);
      }
      rr.Close();
      ...

Listato 3a. Iterazione di ResourceReader (ResWrite.vb)

      ...
      ' Iterate through the resources.
      Dim rr As ResourceReader = New ResourceReader("sample.resources")
      Dim de As IDictionaryEnumerator = rr.GetEnumerator()
      While de.MoveNext()
         Console.WriteLine((de.Key.ToString() + " " + de.Value.ToString()))
      End While
      rr.Close()
      ...

In questo piccolo esempio, è stata creata innanzitutto una ResourceReader per lo stesso file RESOURCES creato in precedenza. Così come durante la scrittura delle risorse, è stato assegnato a una IResourceReader per maggiore flessibilità. È stata quindi utilizzata una DictionaryEnumerator per eseguire la procedura relativa alle risorse, stampando il nome della risorsa e il valore corrispondente nella console.

Sebbene l'utilizzo diretto di una ResourceReader consenta di enumerare le risorse, non consente di recuperare risorse specifiche specificando una voce con nome. Per recuperare risorse specifiche, infatti, è possibile utilizzare la potente ResourceManager nella sezione Recupero di risorse tramite codice.

Vedere anche

Risorse immagine | Creazione del package delle risorse | Recupero di risorse tramite codice | Riepilogo delle risorse | Appendice A: ulteriori informazioni sulle risorse | Appendice B: strumenti delle risorse