Costruttori System.Resources.ResourceManager

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Costruttore ResourceManager(Type)

Questa sezione riguarda l'overload del ResourceManager(Type) costruttore.

App desktop

Nelle app desktop, resource manager usa il resourceSource parametro per caricare un determinato file di risorse come indicato di seguito:

  • Se l'attributo NeutralResourcesLanguageAttribute non viene usato per indicare che le risorse delle impostazioni cultura predefinite risiedono in un assembly satellite, gestione risorse presuppone che il file di risorse per le impostazioni cultura predefinite venga trovato nello stesso assembly del tipo specificato dal resourceSource parametro .
  • Gestione risorse presuppone che il file di risorse predefinito abbia lo stesso nome di base del tipo specificato dal resourceSource parametro .
  • Gestione risorse usa la classe predefinita ResourceSet per modificare il file di risorse.

Ad esempio, dato un tipo denominato MyCompany.MyProduct.MyType, resource manager cerca un file con estensione resources denominato MyCompany.MyProduct.MyType.resources nell'assembly che definisce MyType.

In Visual Studio, Progettazione risorse genera automaticamente il codice che definisce una internal classe (in C#) o Friend (in Visual Basic) il cui nome corrisponde al nome di base del file con estensione resources per le impostazioni cultura predefinite. In questo modo è possibile creare un'istanza di un ResourceManager oggetto e associarla a un determinato set di risorse ottenendo un oggetto di tipo il cui nome corrisponde al nome della risorsa, perché purché la classe sia visibile al compilatore, le risorse devono essere anche. Ad esempio, se un file con estensione resources è denominato Resource1, l'istruzione seguente crea un'istanza di un ResourceManager oggetto per gestire il file con estensione resources denominato Resource1:

ResourceManager rm = new ResourceManager(typeof(Resource1));

Se non si usa Visual Studio, è possibile creare una classe senza membri il cui spazio dei nomi e nome corrispondono a quello del file con estensione resources predefinito. Nell'esempio viene illustrata una situazione di questo tipo.

App di Windows 8.x

Importante

Anche se la ResourceManager classe è supportata nelle app di Windows 8.x, non è consigliabile usarla. Usare questa classe solo quando si sviluppano progetti della libreria di classi portabile che possono essere usati con le app di Windows 8.x. Per recuperare le risorse dalle app di Windows 8.x, usare invece la classe Windows.ApplicationModel.Resources.ResourceLoader .

Nelle app ResourceManager di Windows 8.x usa il resourceSource parametro per dedurre l'assembly, il nome di base e lo spazio dei nomi in cui gli elementi della risorsa possono trovarsi all'interno del file PRI (Package Resource Index) dell'app. Ad esempio, dato un tipo denominato MyCompany.MyProduct.MyType definito in MyAssembly, resource manager cerca un identificatore del set di risorse denominato MyAssembly e cerca un ambito MyCompany.MyProduct.MyType all'interno del set di risorse. Resource Manager cerca gli elementi delle risorse nel contesto predefinito (impostazioni cultura correnti, contrasto elevato corrente e così via) all'interno di questo ambito.

Esempio

Nell'esempio seguente viene utilizzato il ResourceManager(Type) costruttore per creare un'istanza di un ResourceManager oggetto . È costituito da risorse compilate da .txt file per le impostazioni cultura inglese (en), francese (Francia) (fr-FR) e russo (Russia) (ru-UR). L'esempio modifica le impostazioni cultura correnti e le impostazioni cultura correnti dell'interfaccia utente in Inglese (Stati Uniti), Francese (Francia), Russo (Russia) e Svedese (Svezia). Chiama quindi il GetString(String) metodo per recuperare la stringa localizzata, che visualizza un messaggio di saluto che dipende dall'ora del giorno.

L'esempio richiede tre file di risorse basati su testo, come indicato nella tabella seguente. Ogni file include risorse stringa denominate Morning, Afternoone Evening.

Cultura File name Nome risorsa Valore della risorsa
en-US GreetingResources.txt Morning Buongiorno
en-US GreetingResources.txt Afternoon Buon pomeriggio
en-US GreetingResources.txt Evening Buonasera
fr-FR GreetingResources.fr-FR.txt Morning Bonjour
fr-FR GreetingResources.fr-FR.txt Afternoon Bonjour
fr-FR GreetingResources.fr-FR.txt Evening Bonsoir
ru-RU GreetingResources.ru-RU.txt Morning Доброе утро
ru-RU GreetingResources.ru-RU.txt Afternoon Добрый день
ru-RU GreetingResources.ru-RU.txt Evening Добрый вечер

È possibile usare il file batch seguente per compilare l'esempio di Visual Basic e creare un eseguibile denominato Greet.exe. Per eseguire la compilazione con C#, modificare il nome del compilatore da vbc a csc e l'estensione di file da .vb a .cs.

resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources

md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources

md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources

Ecco il codice sorgente per l'esempio (ShowDate.vb per la versione di Visual Basic o ShowDate.cs per la versione C# del codice).

using System;
using System.Resources;
using System.Globalization;
using System.Threading;

[assembly: NeutralResourcesLanguage("en")]

public class Example2
{
    public static void Main()
    {
        string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
        DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                     DateTime.Now.Day, 12, 0, 0);
        DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                        DateTime.Now.Day, 18, 0, 0);

        ResourceManager rm = new ResourceManager(typeof(GreetingResources));

        foreach (var cultureName in cultureNames)
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
            Console.WriteLine("The current UI culture is {0}",
                              CultureInfo.CurrentUICulture.Name);
            if (DateTime.Now < noon)
                Console.WriteLine("{0}!", rm.GetString("Morning"));
            else if (DateTime.Now < evening)
                Console.WriteLine("{0}!", rm.GetString("Afternoon"));
            else
                Console.WriteLine("{0}!", rm.GetString("Evening"));
            Console.WriteLine();
        }
    }

    internal class GreetingResources
    {
    }
}
// The example displays output like the following:
//       The current UI culture is en-US
//       Good afternoon!
//
//       The current UI culture is fr-FR
//       Bonjour!
//
//       The current UI culture is ru-RU
//       Добрый день!
//
//       The current UI culture is sv-SE
//       Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim noon As New Date(Date.Now.Year, Date.Now.Month, 
                           Date.Now.Day, 12,0,0)
      Dim evening As New Date(Date.Now.Year, Date.Now.Month,
                              Date.Now.Day, 18, 0, 0)                          
      
      Dim rm As New ResourceManager(GetType(GreetingResources))
      
      For Each cultureName In cultureNames
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current UI culture is {0}", 
                           CultureInfo.CurrentUICulture.Name)
         If Date.Now < noon Then
            Console.WriteLine("{0}!", rm.GetString("Morning"))
         ElseIf Date.Now < evening Then
            Console.WriteLine("{0}!", rm.GetString("Afternoon"))
         Else
            Console.WriteLine("{0}!", rm.GetString("Evening"))
         End If 
         Console.WriteLine()
      Next
   End Sub
End Module

Friend Class GreetingResources
End Class
' The example displays output like the following:
'       The current UI culture is en-US
'       Good afternoon!
'       
'       The current UI culture is fr-FR
'       Bonjour!
'       
'       The current UI culture is ru-RU
'       Добрый день!
'       
'       The current UI culture is sv-SE
'       Good afternoon!

Oltre a definire una classe app denominata Example, il codice sorgente definisce una classe interna il cui nome, GreetingResources, corrisponde al nome di base dei file di risorse. In questo modo è possibile creare un'istanza di un ResourceManager oggetto chiamando il ResourceManager(Type) costruttore .

Si noti che l'output visualizza la stringa localizzata appropriata tranne quando le impostazioni cultura dell'interfaccia utente correnti sono svedesi (Svezia), nel qual caso usa risorse in lingua inglese. Poiché le risorse della lingua svedese non sono disponibili, l'app usa le risorse delle impostazioni cultura predefinite, come definito dall'attributo NeutralResourcesLanguageAttribute .

Costruttore ResourceManager(String, Assembly)

Questa sezione riguarda l'overload del ResourceManager(String, Assembly) costruttore.

App desktop

Nelle app desktop i singoli file di risorse specifici delle impostazioni cultura devono essere contenuti negli assembly satellite e il file di risorse delle impostazioni cultura predefinito deve essere contenuto nell'assembly principale. Si presuppone che un assembly satellite contenga risorse per una singola impostazione cultura specificata nel manifesto dell'assembly e che venga caricato in base alle esigenze.

Nota

Per recuperare direttamente le risorse dai file con estensione resources anziché recuperarle dagli assembly, è necessario chiamare il CreateFileBasedResourceManager metodo per creare un'istanza di un ResourceManager oggetto .

Se il file di risorse identificato da baseName non può essere trovato in assembly, il metodo crea un'istanza di un ResourceManager oggetto, ma il tentativo di recuperare una risorsa specifica genera un'eccezione, in MissingManifestResourceExceptiongenere . Per informazioni sulla diagnosi della causa dell'eccezione, vedere la sezione "Gestione dell'eccezione MissingManifestResourceException" dell'argomento della ResourceManager classe.

App di Windows 8.x

Importante

Anche se la ResourceManager classe è supportata nelle app di Windows 8.x, non è consigliabile usarla. Usare questa classe solo quando si sviluppano progetti della libreria di classi portabile che possono essere usati con le app di Windows 8.x. Per recuperare le risorse dalle app di Windows 8.x, usare invece la classe Windows.ApplicationModel.Resources.ResourceLoader .

Nelle app di Windows 8.x, resource manager usa il nome semplice del assembly parametro per cercare un set di risorse corrispondente nel file PRI (Package Resource Index) dell'app. Il baseName parametro viene usato per cercare un elemento della risorsa all'interno del set di risorse. Ad esempio, il nome radice per PortableLibrary1.Resource1.de-DE.resources è PortableLibrary1.Resource1.

Esempio

L'esempio seguente usa una semplice app "Hello World" non localizzata per illustrare il ResourceManager(String, Assembly) costruttore. Il contenuto di un file di testo denominato ExampleResources.txt è Greeting=Hello. Quando l'app viene compilata, la risorsa viene incorporata nell'assembly principale dell'app.

Il file di testo può essere convertito in un file di risorse binario usando il generatore di file di risorse (ResGen.exe) al prompt dei comandi come indicato di seguito:

resgen ExampleResources.txt

L'esempio seguente fornisce il codice eseguibile che crea un'istanza di un ResourceManager oggetto, chiede all'utente di immettere un nome e visualizza un messaggio di saluto.

using System;
using System.Reflection;
using System.Resources;

public class Example1
{
    public static void Main()
    {
        // Retrieve the resource.
        ResourceManager rm = new ResourceManager("ExampleResources",
                                 typeof(Example).Assembly);
        string greeting = rm.GetString("Greeting");

        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        Console.WriteLine("{0} {1}!", greeting, name);
    }
}
// The example produces output similar to the following:
//       Enter your name: John
//       Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources

Module Example1
    Public Sub Main()
        ' Retrieve the resource.
        Dim rm As New ResourceManager("ExampleResources",
                                      GetType(Example).Assembly)
        Dim greeting As String = rm.GetString("Greeting")

        Console.Write("Enter your name: ")
        Dim name As String = Console.ReadLine()
        Console.WriteLine("{0} {1}!", greeting, name)
    End Sub
End Module
' The example produces output similar to the following:
'       Enter your name: John
'       Hello John!

Può essere compilato usando il comando seguente in C#:

csc Example.cs /resource:ExampleResources.resources

Nell'esempio viene recuperato un riferimento all'assembly che contiene il file di risorse passando un tipo definito in tale assembly alla typeof funzione (in C#) o alla GetType funzione (in Visual Basic) e recuperando il valore della relativa Type.Assembly proprietà.