System.Resources.ResourceManager-konstruktorer

Anmärkning

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

ResourceManager(Type) konstruktor

Det här avsnittet gäller överlagring av ResourceManager(Type) konstruktor.

Skrivbordsappar

I skrivbordsappar använder resurshanteraren parametern resourceSource för att läsa in en viss resursfil på följande sätt:

  • Om attributet NeutralResourcesLanguageAttribute inte används för att indikera att resurserna i standardkulturen finns i en satellitsammansättning, förutsätter resurshanteraren att resursfilen för standardkulturen finns i samma sammansättning som den typ som anges av parametern resourceSource.
  • Resurshanteraren förutsätter att standardresursfilen har samma basnamn som den typ som anges av parametern resourceSource.
  • Resurshanteraren använder standardklassen ResourceSet för att ändra resursfilen.

Med en typ med namnet MyCompany.MyProduct.MyTypeletar resurshanteraren till exempel efter en .resources-fil med namnet MyCompany.MyProduct.MyType.resources i sammansättningen som definierar MyType.

I Visual Studio genererar Resursdesignern automatiskt kod som definierar en internal (i C#) eller Friend -klassen (i Visual Basic) vars namn är samma som basnamnet för .resources fil för standardkulturen. Detta gör det möjligt att instansiera ett ResourceManager objekt och koppla det till en viss uppsättning resurser genom att hämta ett typobjekt vars namn motsvarar resursens namn, eftersom resurserna måste vara lika så länge klassen är synlig för kompilatorn. Om till exempel en .resources-fil heter Resource1 instansierar följande instruktion ett ResourceManager objekt för att hantera .resources fil med namnet Resource1:

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

Om du inte använder Visual Studio kan du skapa en klass utan medlemmar vars namnområde och namn är samma som för standardfilen .resources fil. Exemplet innehåller en bild.

Windows 8.x-appar

Viktigt!

Även om klassen ResourceManager stöds i Windows 8.x-appar rekommenderar vi inte att den används. Använd endast den här klassen när du utvecklar portabla klassbiblioteksprojekt som kan användas med Windows 8.x-appar. Om du vill hämta resurser från Windows 8.x-appar använder du klassen Windows.ApplicationModel.Resources.ResourceLoader i stället.

I Windows 8.x-appar använder ResourceManager parametern resourceSource för att härleda sammansättningen, basnamnet och namnområdet där resursobjekten kan finnas i appens PRI-fil (Package Resource Index). Med en typ med namnet MyCompany.MyProduct.MyType som definieras i MyAssemblyletar resurshanteraren efter en resursuppsättningsidentifierare med namnet MyAssembly och letar efter ett omfång MyCompany.MyProduct.MyType i resursuppsättningen. Resurshanteraren söker efter resursobjekt under standardkontexten (aktuell kultur, aktuell inställning för högkontrast och så vidare) inom det här omfånget.

Exempel

I följande exempel används konstruktorn ResourceManager(Type) för att instansiera ett ResourceManager objekt. Den består av resurser som sammanställts från .txt filer för den engelska (en), franska (Frankrike) (fr-FR), och ryska (Ryssland) (ru-RU) kulturer. Exemplet ändrar den aktuella kulturen och den aktuella användargränssnittskulturen till engelska (USA), franska (Frankrike), ryska (Ryssland) och svenska (Sverige). Den anropar sedan metoden GetString(String) för att hämta den lokaliserade strängen, som visar en hälsning som är beroende av tiden på dagen.

Exemplet kräver tre textbaserade resursfiler, enligt listan i följande tabell. Varje fil innehåller strängresurser med namnet Morning, Afternoonoch Evening.

Kultur Filnamn Resursnamn Resursvärde
en-US GreetingResources.txt Morning God morgon
en-US GreetingResources.txt Afternoon God eftermiddag
en-US GreetingResources.txt Evening God kväll
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 Добрый вечер

Du kan använda följande batchfil för att kompilera Visual Basic-exemplet och skapa en körbar fil med namnet Greet.exe. Kompilera med C#genom att ändra kompilatornamnet från vbc till csc och filnamnstillägget från .vb till .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

Här är källkoden för exemplet (ShowDate.vb för Visual Basic-versionen eller ShowDate.cs för C#-versionen av koden).

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 {CultureInfo.CurrentUICulture.Name}");
            if (DateTime.Now < noon)
                Console.WriteLine($"{rm.GetString("Morning")}!");
            else if (DateTime.Now < evening)
                Console.WriteLine($"{rm.GetString("Afternoon")}!");
            else
                Console.WriteLine($"{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!

Förutom att definiera en appklass med namnet Exampledefinierar källkoden en intern klass vars namn, GreetingResources, är samma som basnamnet för resursfilerna. Detta gör det möjligt att instansiera ett ResourceManager objekt genom att anropa ResourceManager(Type) konstruktorn.

Observera att utdata visar lämplig lokaliserad sträng utom när den aktuella användargränssnittskulturen är svensk (Sverige), i vilket fall den använder engelska språkresurser. Eftersom svenska språkresurser inte är tillgängliga använder appen i stället resurserna i standardkulturen, enligt definitionen i attributet NeutralResourcesLanguageAttribute.

ResourceManager(String, Assembly) konstruktor

Det här avsnittet gäller överlagring av ResourceManager(String, Assembly) konstruktor.

Skrivbordsappar

I skrivbordsappar ska de enskilda kulturspecifika resursfilerna finnas i satellitsammansättningar och standardkulturens resursfil ska finnas i huvudsammansättningen. En satellitsammansättning antas innehålla resurser för en specifik kultur som anges i sammansättningens manifest och laddas in vid behov.

Anmärkning

Om du vill hämta resurser från .resources filer direkt i stället för att hämta dem från sammansättningar måste du anropa metoden CreateFileBasedResourceManager i stället för att instansiera ett ResourceManager objekt.

Om resursfilen som identifieras av baseName inte finns i assemblyinstansierar metoden ett ResourceManager objekt, men försöket att hämta en specifik resurs genererar ett undantag, vanligtvis MissingManifestResourceException. Information om hur du diagnostiserar orsaken till undantaget finns i avsnittet "Hantera undantaget MissingManifestResourceException" i ResourceManager-klassavsnittet.

Windows 8.x-appar

Viktigt!

Även om klassen ResourceManager stöds i Windows 8.x-appar rekommenderar vi inte att den används. Använd endast den här klassen när du utvecklar portabla klassbiblioteksprojekt som kan användas med Windows 8.x-appar. Om du vill hämta resurser från Windows 8.x-appar använder du klassen Windows.ApplicationModel.Resources.ResourceLoader i stället.

I Windows 8.x-appar använder resurshanteraren det enkla namnet på parametern assembly för att leta upp en matchande resursuppsättning i appens PRI-fil (Package Resource Index). Parametern baseName används för att leta upp ett resursobjekt i resursuppsättningen. Till exempel rotnamnet för PortableLibrary1.Resource1.de-DE.resources är PortableLibrary1.Resource1.

Exempel

I följande exempel används en enkel icke-lokaliserad "Hello World"-app för att illustrera ResourceManager(String, Assembly) konstruktorn. Innehållet i en textfil med namnet ExampleResources.txt är Greeting=Hello. När appen kompileras bäddas resursen in i huvudappsammansättningen.

Textfilen kan konverteras till en binär resursfil med hjälp av Resource File Generator (ResGen.exe) i kommandotolken enligt följande:

resgen ExampleResources.txt

I följande exempel visas den körbara kod som instansierar ett ResourceManager objekt, uppmanar användaren att ange ett namn och visar en hälsning.

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($"{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!

Den kan kompileras med hjälp av följande kommando i C#:

csc Example.cs /resource:ExampleResources.resources

Exemplet hämtar en referens till sammansättningen som innehåller resursfilen genom att skicka en typ som definierats i sammansättningen till funktionen typeof (i C#) eller funktionen GetType (i Visual Basic) och hämta värdet för dess Type.Assembly egenskap.