System.Resources.ResourceManager-Konstruktoren

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

ResourceManager(Type)-Konstruktor

Dieser Abschnitt bezieht sich auf die ResourceManager(Type) Konstruktorüberladung.

Desktop-App

In Desktop-Apps verwendet der Ressourcen-Manager den resourceSource Parameter, um eine bestimmte Ressourcendatei wie folgt zu laden:

  • Wenn das NeutralResourcesLanguageAttribute Attribut nicht verwendet wird, um anzugeben, dass sich die Ressourcen der Standardkultur in einer Satellitenassembly befinden, geht der Ressourcenmanager davon aus, dass die Ressourcendatei für die Standardkultur in derselben Assembly gefunden wird wie der vom resourceSource Parameter angegebene Typ.
  • Der Ressourcenmanager geht davon aus, dass die Standardressourcendatei denselben Basisnamen wie der vom resourceSource Parameter angegebene Typ aufweist.
  • Der Ressourcen-Manager verwendet die Standardklasse ResourceSet , um die Ressourcendatei zu bearbeiten.

Beispielsweise sucht der Ressourcen-Manager nach MyCompany.MyProduct.MyTypeeiner Ressourcendatei namens "MyCompany.MyProduct.MyType.resources " in der Assembly, die definiert MyType.

In Visual Studio generiert der Ressourcen-Designer automatisch Code, der eine internal (in C#) oder Friend (in Visual Basic) Klasse definiert, deren Name dem Basisnamen der RESSOURCEN-Datei für die Standardkultur entspricht. Dadurch kann ein ResourceManager Objekt instanziiert und mit einem bestimmten Ressourcensatz gekoppelt werden, indem ein Typobjekt, dessen Name dem Namen der Ressource entspricht, abrufen, da die Klasse auch für den Compiler sichtbar ist. Wenn beispielsweise eine RESSOURCEN-Datei den Namen "Resource1" hat, instanziiert die folgende Anweisung ein ResourceManager Objekt zum Verwalten der RESSOURCEN-Datei mit dem Namen Resource1:

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

Wenn Sie Visual Studio nicht verwenden, können Sie eine Klasse ohne Member erstellen, deren Namespace und Name mit der der Standardressourcendatei identisch sind. Dies wird im Beispiel veranschaulicht.

Windows 8.x-Apps

Wichtig

Obwohl die ResourceManager Klasse in Windows 8.x-Apps unterstützt wird, wird die Verwendung nicht empfohlen. Verwenden Sie diese Klasse nur, wenn Sie portable Klassenbibliotheksprojekte entwickeln, die mit Windows 8.x-Apps verwendet werden können. Um Ressourcen aus Windows 8.x-Apps abzurufen, verwenden Sie stattdessen die Windows.ApplicationModel.Resources.ResourceLoader-Klasse .

In Windows 8.x-Apps wird der resourceSource Parameter verwendet, ResourceManager um die Assembly, den Basisnamen und den Namespace abzuleiten, in dem sich die Ressourcenelemente in der PRI-Datei (Package Resource Index) der App befinden können. Beispielsweise sucht der Ressourcen-Manager anhand eines Typs, MyCompany.MyProduct.MyType der definiert MyAssemblyist, nach einem Ressourcensatzbezeichner mit dem Namen MyAssembly und sucht nach einem Bereich MyCompany.MyProduct.MyType innerhalb dieses Ressourcensatzes. Der Ressourcenmanager sucht innerhalb dieses Bereichs nach Ressourcenelementen im Standardkontext (aktuelle Kultur, aktuelle Einstellung mit hohem Kontrast usw.).

Beispiel

Im folgenden Beispiel wird der ResourceManager(Type) Konstruktor verwendet, um ein ResourceManager Objekt zu instanziieren. Es besteht aus Ressourcen, die aus .txt Dateien für die Kulturen Englisch (en), Französisch (Frankreich) (fr-FR) und Russisch (Russland) (ru-RU) kompiliert wurden. Im Beispiel wird die aktuelle Kultur und die aktuelle UI-Kultur in Englisch (USA), Französisch (Frankreich), Russisch (Russland) und Schwedisch (Schweden) geändert. Anschließend wird die GetString(String) Methode aufgerufen, um die lokalisierte Zeichenfolge abzurufen, die eine Begrüßung anzeigt, die von der Tageszeit abhängt.

Für das Beispiel sind drei textbasierte Ressourcendateien erforderlich, wie in der folgenden Tabelle aufgeführt. Jede Datei enthält Zeichenfolgenressourcen namens Morning, , Afternoonund Evening.

Kultur Dateiname Ressourcenname Ressourcenwert
de-De GreetingResources.txt Morning Guten Morgen
de-De GreetingResources.txt Afternoon Guten Tag
de-De GreetingResources.txt Evening Guten Abend
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 Добрый вечер

Sie können die folgende Batchdatei verwenden, um das Visual Basic-Beispiel zu kompilieren und eine ausführbare Datei mit dem Namen Greet.exe zu erstellen. Um mit C# zu kompilieren, ändern Sie den Compilernamen von vbc zu csc und die Dateierweiterung von .vb zu .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

Hier sehen Sie den Quellcode für das Beispiel (ShowDate.vb für die Visual Basic-Version oder ShowDate.cs für die C#-Version des Codes).

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!

Neben der Definition einer App-Klasse mit dem Namen Exampledefiniert der Quellcode eine interne Klasse, deren Name, deren GreetingResourcesName mit dem Basisnamen der Ressourcendateien übereinstimmt. Dadurch kann ein ResourceManager Objekt erfolgreich instanziiert werden, indem der ResourceManager(Type) Konstruktor aufgerufen wird.

Beachten Sie, dass in der Ausgabe die entsprechende lokalisierte Zeichenfolge angezeigt wird, außer wenn die aktuelle UI-Kultur Schwedisch (Schweden) ist, in diesem Fall werden englischsprachige Ressourcen verwendet. Da schwedische Sprachressourcen nicht verfügbar sind, verwendet die App stattdessen die Ressourcen der Standardkultur, wie durch das NeutralResourcesLanguageAttribute Attribut definiert.

ResourceManager(String, Assembly)-Konstruktor

Dieser Abschnitt bezieht sich auf die ResourceManager(String, Assembly) Konstruktorüberladung.

Desktop-App

In Desktop-Apps sollten die einzelnen kulturspezifischen Ressourcendateien in Satellitenassemblys enthalten sein, und die Ressourcendatei der Standardkultur sollte in der Standard-Assembly enthalten sein. Es wird davon ausgegangen, dass eine Satellitenassembly Ressourcen für eine einzelne Kultur enthält, die im Manifest dieser Assembly angegeben ist und bei Bedarf geladen wird.

Hinweis

Um Ressourcen aus RESSOURCENdateien direkt abzurufen, anstatt sie aus Assemblys abzurufen, müssen Sie stattdessen die CreateFileBasedResourceManager Methode aufrufen, um ein ResourceManager Objekt zu instanziieren.

Wenn die von der Methode identifizierte baseName Ressourcendatei nicht assemblygefunden werden kann, instanziiert die Methode ein ResourceManager Objekt, aber der Versuch, eine bestimmte Ressource abzurufen, löst in der Regel MissingManifestResourceExceptioneine Ausnahme aus. Informationen zur Diagnose der Ursache der Ausnahme finden Sie im Abschnitt "Handling the MissingManifestResourceException Exception" des ResourceManager Klassenthemas.

Windows 8.x-Apps

Wichtig

Obwohl die ResourceManager Klasse in Windows 8.x-Apps unterstützt wird, wird die Verwendung nicht empfohlen. Verwenden Sie diese Klasse nur, wenn Sie portable Klassenbibliotheksprojekte entwickeln, die mit Windows 8.x-Apps verwendet werden können. Um Ressourcen aus Windows 8.x-Apps abzurufen, verwenden Sie stattdessen die Windows.ApplicationModel.Resources.ResourceLoader-Klasse .

In Windows 8.x-Apps verwendet der Ressourcen-Manager den einfachen Namen des assembly Parameters, um einen übereinstimmenden Ressourcensatz in der PRI-Datei (Package Resource Index) der App nachzuschlagen. Der baseName Parameter wird verwendet, um ein Ressourcenelement innerhalb des Ressourcensatzes nachzuschlagen. Beispielsweise ist der Stammname für PortableLibrary1.Resource1.de-DE.resources PortableLibrary1.Resource1.

Beispiel

Im folgenden Beispiel wird eine einfache, nicht lokalisierte "Hallo Welt"-App verwendet, um den ResourceManager(String, Assembly) Konstruktor zu veranschaulichen. Der Inhalt einer Textdatei mit dem Namen ExampleResources.txt lautet Greeting=Hello. Wenn die App kompiliert wird, wird die Ressource in die Standard App-Assembly eingebettet.

Die Textdatei kann mithilfe des Ressourcendatei-Generators (ResGen.exe) an der Eingabeaufforderung wie folgt in eine binärressourcendatei konvertiert werden:

resgen ExampleResources.txt

Das folgende Beispiel stellt den ausführbaren Code bereit, der ein ResourceManager Objekt instanziiert, den Benutzer auffordert, einen Namen einzugeben, und zeigt eine Begrüßung an.

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!

Sie kann mithilfe des folgenden Befehls in C# kompiliert werden:

csc Example.cs /resource:ExampleResources.resources

Im Beispiel wird ein Verweis auf die Assembly abgerufen, die die Ressourcendatei enthält, indem ein in dieser Assembly definierter Typ an die typeof Funktion (in C#) oder die GetType Funktion (in Visual Basic) übergeben und der Wert seiner Type.Assembly Eigenschaft abgerufen wird.