Конструкторы System.Resources.ResourceManager

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Конструктор ResourceManager(Type)

Этот раздел относится к перегрузке конструктора ResourceManager(Type) .

Классические приложения

В классических приложениях диспетчер ресурсов использует resourceSource параметр для загрузки определенного файла ресурсов следующим образом:

  • NeutralResourcesLanguageAttribute Если атрибут не используется для указания того, что ресурсы языка и региональных параметров по умолчанию находятся в вспомогательной сборке, диспетчер ресурсов предполагает, что файл ресурсов для языка и региональных параметров по умолчанию найден в той же сборке, что и тип, указанный параметромresourceSource.
  • Диспетчер ресурсов предполагает, что файл ресурсов по умолчанию имеет то же базовое имя, что и тип, указанный параметром resourceSource .
  • Диспетчер ресурсов использует класс по умолчанию ResourceSet для управления файлом ресурсов.

Например, при указании типа MyCompany.MyProduct.MyTypeдиспетчер ресурсов ищет файл ресурсов с именем MyCompany.MyProduct.MyType.resources в сборке, которая определяет MyType.

В Visual Studio конструктор ресурсов автоматически создает код, определяющий internal класс (в C#) или Friend (в Visual Basic), имя которого совпадает с базовым именем файла ресурсов для языка и региональных параметров по умолчанию. Это позволяет создать экземпляр ResourceManager объекта и присвоить ему определенный набор ресурсов, получив объект типа, имя которого соответствует имени ресурса, так как до тех пор, пока класс отображается компилятору, ресурсы также должны быть. Например, если файл .resources имеет имя Resource1, следующая инструкция создает ResourceManager экземпляр объекта для управления файлом ресурсов с именем Resource1:

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

Если вы не используете Visual Studio, можно создать класс без членов, пространство имен и имя которого совпадают с именем по умолчанию. Иллюстрация приведена в примере.

Приложения Windows 8.x

Важно!

ResourceManager Хотя класс поддерживается в приложениях Windows 8.x, мы не рекомендуем использовать его. Используйте этот класс только при разработке проектов переносимой библиотеки классов, которые можно использовать с приложениями Windows 8.x. Чтобы получить ресурсы из приложений Windows 8.x, используйте вместо него класс Windows.ApplicationModel.Resources.ResourceLoader .

В приложениях ResourceManager Windows 8.x используется resourceSource параметр для вывода сборки, базового имени и пространства имен, где элементы ресурсов могут находиться в файле индекса ресурсов пакета приложения (PRI). Например, учитывая тип с именемMyCompany.MyProduct.MyType, определенным вMyAssembly, диспетчер ресурсов ищет идентификатор набора ресурсов с именем MyAssembly и ищет область MyCompany.MyProduct.MyType в этом наборе ресурсов. Диспетчер ресурсов ищет элементы ресурсов в контексте по умолчанию (текущий язык и региональные параметры, текущий параметр высокой контрастности и т. д.) в рамках этого область.

Пример

В следующем примере конструктор используется ResourceManager(Type) для создания экземпляра ResourceManager объекта. Он состоит из ресурсов, скомпилированных из .txt файлов для английского языка (en), французского (Франция) (fr-FR) и российских (Россия) культур (ru-RU). В примере изменяется текущий язык и региональные параметры пользовательского интерфейса на английский (США), французский (Франция), русский (Россия) и шведский (Швеция). Затем он вызывает GetString(String) метод для получения локализованной строки, которая отображает приветствие, которое зависит от времени дня.

В примере требуется три текстовых файла ресурсов, как указано в следующей таблице. Каждый файл содержит строковые ресурсы с именем Morning, Afternoonи Evening.

Культура Имя файла Имя ресурса Значение ресурса
en-US GreetingResources.txt Morning Доброе утро!
en-US GreetingResources.txt Afternoon Добрый день
en-US GreetingResources.txt Evening Добрый вечер
fr-FR GreetingResources.fr-FR.txt Morning Bonjour
fr-FR GreetingResources.fr-FR.txt Afternoon Bonjour
fr-FR GreetingResources.fr-FR.txt Evening Бонжур
ru-RU GreetingResources.ru-RU.txt Morning Доброе утро
ru-RU GreetingResources.ru-RU.txt Afternoon Добрый день
ru-RU GreetingResources.ru-RU.txt Evening Добрый вечер

Следующий пакетный файл можно использовать для компиляции примера Visual Basic и создания исполняемого файла с именем Greet.exe. Чтобы скомпилироваться с помощью C#, измените имя компилятора на vbccsc расширение файла на .cs.vb .

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

Ниже приведен исходный код для примера (ShowDate.vb для версии Visual Basic или ShowDate.cs для версии C# кода).

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!

Помимо определения класса приложения с именем Example, исходный код определяет внутренний класс, имя которого совпадает GreetingResourcesс базовым именем файлов ресурсов. Это позволяет успешно создать экземпляр ResourceManager объекта путем вызова конструктора ResourceManager(Type) .

Обратите внимание, что выходные данные отображают соответствующую локализованную строку, за исключением случаев, когда текущий язык и региональные параметры пользовательского интерфейса — шведский (Швеция), в этом случае он использует языковые ресурсы английского языка. Так как ресурсы шведского языка недоступны, приложение использует ресурсы языка и региональных параметров по умолчанию, как определено атрибутом NeutralResourcesLanguageAttribute .

Конструктор ResourceManager(String, Assembly)

Этот раздел относится к перегрузке конструктора ResourceManager(String, Assembly) .

Классические приложения

В классических приложениях файлы ресурсов для отдельных языков и региональных параметров должны содержаться в вспомогательных сборках, а файл ресурсов языка и региональных параметров по умолчанию должен содержаться в основной сборке. Предполагается, что вспомогательные сборки содержат ресурсы для одного языка и региональных параметров, указанного в манифесте этой сборки, и загружается по мере необходимости.

Примечание.

Чтобы получить ресурсы из файлов ресурсов напрямую, а не извлекать их из сборок, необходимо вызвать CreateFileBasedResourceManager метод вместо создания экземпляра ResourceManager объекта.

Если файл ресурсов, идентифицированный baseName не удалось найти assembly, метод создает экземпляр ResourceManager объекта, но попытка получить определенный ресурс вызывает исключение, как правило MissingManifestResourceException. Сведения о диагностике причины исключения см. в разделе ResourceManager "Обработка исключения MissingManifestResourceException" раздела класса.

Приложения Windows 8.x

Важно!

ResourceManager Хотя класс поддерживается в приложениях Windows 8.x, мы не рекомендуем использовать его. Используйте этот класс только при разработке проектов переносимой библиотеки классов, которые можно использовать с приложениями Windows 8.x. Чтобы получить ресурсы из приложений Windows 8.x, используйте вместо него класс Windows.ApplicationModel.Resources.ResourceLoader .

В приложениях Windows 8.x диспетчер ресурсов использует простое имя assembly параметра для поиска соответствующего набора ресурсов в файле индекса ресурсов пакета приложения (PRI). Параметр baseName используется для поиска элемента ресурса в наборе ресурсов. Например, корневое имя для PortableLibrary1.Resource1.de-DE.resources — PortableLibrary1.Resource1.

Пример

В следующем примере используется простое не локализованное приложение Hello World для иллюстрации конструктора ResourceManager(String, Assembly) . Содержимое текстового файла с именем ExampleResources.txtGreeting=Hello. При компиляции приложения ресурс внедряется в основную сборку приложения.

Текстовый файл можно преобразовать в двоичный файл ресурсов с помощью генератора файлов ресурсов (ResGen.exe) в командной строке следующим образом:

resgen ExampleResources.txt

В следующем примере представлен исполняемый код, который создает ResourceManager экземпляр объекта, запрашивает у пользователя ввод имени и отображает приветствие.

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!

Его можно скомпилировать с помощью следующей команды в C#:

csc Example.cs /resource:ExampleResources.resources

В примере извлекается ссылка на сборку, содержащую файл ресурсов, передав тип, определенный в этой сборке typeof функции (в C#) или GetType функцию (в Visual Basic), и извлекая значение его Type.Assembly свойства.