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.MyType
einer 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 MyAssembly
ist, 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
, , Afternoon
und 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 Example
definiert der Quellcode eine interne Klasse, deren Name, deren GreetingResources
Name 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 assembly
gefunden 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.