Ресурсы в приложениях .NET

Практически любое высококачественное приложение должно использовать ресурсы. Ресурс представляет собой любые неисполняемые данные, которые логически развертываются вместе с приложением. Ресурсы могут отображаться в приложении в виде сообщений об ошибках либо как часть интерфейса пользователя. Ресурсы могут содержать данные различных видов, включая символьные строки, изображения и объекты. (Для записи сохраняемых объектов в файл ресурсов объекты должны быть сериализуемыми.) Благодаря хранению данных в файле ресурсов сами данные можно изменять без повторной компиляции всего приложения. Это также позволяет хранить данные в одном месте и исключает необходимость в использовании жестко закодированных данных, которые хранятся в нескольких местах.

.NET обеспечивает всестороннюю поддержку для создания и локализации ресурсов. Кроме того, .NET поддерживает простую модель упаковки и развертывания локализованных ресурсов.

Создание и локализация ресурсов

В нелокализованном приложении файлы ресурсов можно использовать как хранилище для данных приложения, особенно для строк, которые в противном случае было бы необходимо жестко задавать в нескольких местах в исходном коде. Чаще всего ресурсы создаются в виде текстовых (txt) или XML-файлов (.resx), а для их компиляции в двоичные RESOURCES-файлы используется Resgen.exe (генератор файлов ресурсов). Эти файлы можно затем встроить в исполняемый файл приложения с помощью компилятора языка. Дополнительные сведения о создании ресурсов см. в разделе Создание файлов ресурсов.

Вы также можете локализовать ресурсы приложения для конкретных языков и региональных параметров. Это позволяет создавать локализованные (переведенные) версии приложений. При разработке приложения, использующего локализованные ресурсы, необходимо назначить язык и региональные параметры, являющиеся нейтральными или резервными, языком и региональными параметрами, ресурсы которого используются в случае отсутствия подходящих ресурсов. Как правило, ресурсы нейтрального языка и региональных параметров хранятся в исполняемом файле приложения. Остальные ресурсы для отдельных языков и региональных параметров хранятся в автономных вспомогательных сборках. Дополнительные сведения см. в разделе Создание вспомогательных сборок.

Упаковка и развертывание ресурсов

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

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

Дополнительные сведения см. в статье Упаковка и развертывание ресурсов.

Извлечение ресурсов

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

  • Присвоением свойству Thread.CurrentUICulture объекта CultureInfo, который представляет локализованные значения языка и региональных параметров.

  • Если язык и региональные параметры не заданы явным образом, соответствующие значения по умолчанию для пользовательского интерфейса каждого потока извлекаются из свойства CultureInfo.DefaultThreadCurrentUICulture.

  • Если язык и региональные параметры по умолчанию для пользовательского интерфейса в потоке не заданы явным образом, применяются язык и региональные параметры текущего пользователя на локальном компьютере. В реализациях .NET на базе Windows для этого вызывается Windows-функция GetUserDefaultUILanguage.

Дополнительные сведения об указании языка и региональных параметров для пользовательского интерфейса см. в разделах справки CultureInfo и CultureInfo.CurrentUICulture.

Ресурсы для текущего или определенного языка и региональных параметров пользовательского интерфейса можно получить с помощью класса System.Resources.ResourceManager. Хотя для получения ресурсов чаще всего используется класс ResourceManager, пространство имен System.Resources содержит дополнительные типы, которые можно использовать для получения ресурсов. Например:

  • Класс ResourceReader, который позволяет перечислять ресурсы, встроенные в сборку или хранящиеся в отдельном двоичном RESOURCES-файле. Это удобно, когда точные имена ресурсов, доступных во время выполнения, неизвестны.

  • Класс ResXResourceReader, который позволяет получать ресурсы из XML-файла (.resx).

  • Класс ResourceSet, который позволяет получать ресурсы для конкретного языка и региональных параметров без учета правил отката. Ресурсы могут храниться в сборке или отдельном двоичном RESOURCES-файле. Можно также разработать реализацию IResourceReader, которая позволит использовать класс ResourceSet для извлечения ресурсов из другого источника.

  • Класс ResXResourceSet, который позволяет получить в память все элементы из XML-файла ресурсов.

См. также