Извлечение ресурсов из вспомогательных сборок
Обновлен: Ноябрь 2007
В идеальном случае следует упаковывать ресурсы для сборки по умолчанию или нейтральной сборки вместе с основной сборкой и создавать отдельные вспомогательные сборки для каждого языка, поддерживаемого приложением. Класс ResourceManager предоставляет доступ к ресурсам, зависящим от языка и региона, во время выполнения программы и управляет извлечением ресурсов приложением с помощью процесса перехода к другим ресурсам. Дополнительные сведения см. в подразделе "Процесс использования запасных ресурсов" раздела Упаковка и развертывание ресурсов. Для доступа к ресурсам рекомендуется использовать один из конструкторов класса ResourceManager. Для этого ресурсы должны либо быть скомпилированы во вспомогательные сборки, либо являться частью основной сборки приложения.
Класс ResourceManager определяет извлекаемые ресурсы на основании свойства CultureInfo.CurrentUICulture текущего потока. Например, если приложение компилируется с ресурсами на английском языке по умолчанию в основной сборке и двух вспомогательных сборках, содержащих ресурсы для французского и немецкого языка, и для свойства CurrentUICulture задано значение "de", объект ResourceManager извлекает ресурсы на немецком языке. Дополнительные сведения об установке свойства CurrentUICulture см. в разделе Использование свойства CurrentUICulture.
В следующем примере метод ResourceManager.GetString используется для извлечения и отображения строкового ресурса.
…
Dim private rm As ResourceManager
rm = New ResourceManager("MyStrings", Me.GetType().Assembly)
Console.Writeline(rm.GetString("string1"))
…
…
private ResourceManager rm;
rm = new ResourceManager("MyStrings", this.GetType().Assembly);
Console.Writeline(rm.GetString("string1"));
…
Этот код извлекает и отображает строку string1 из файла MyStrings. В действительности загружаемая строка зависит от свойства CurrentUICulture текущего потока.
В следующем примере метод ResourceManager.GetObject используется для извлечения и отображения двоичного ресурса (например изображения).
…
Dim private rm As ResourceManager
rm = New ResourceManager("MyImages", Me.GetType().Assembly)
PictureBox.Image = Ctype(rm.GetObject("MyObject"), System.Drawing.Image)
…
…
private ResourceManager rm;
rm = new ResourceManager("MyImages", this.GetType().Assembly);
PictureBox.Image = (System.Drawing.Image)rm.GetObject("MyObject");
…
Этот код загружает объект с именем MyObject из файла ресурсов MyImages. Он приводит объект MyObject к типу Image и присваивает его свойству "Image" объекта PictureBox. В действительности загружаемый объект зависит от свойства CurrentUICulture текущего потока.
Класс ResourceSet хранит все ресурсы, локализованные для определенного языка и региона. Класс ResourceSet не выполняет перехода к резервным ресурсам. Поэтому класс ResourceSet нецелесообразно использовать в локализованных приложениях.
Поддержка управления версиями во вспомогательных сборках
Когда объект ResourceManager извлекает запрошенные ресурсы, по умолчанию выполняется поиск вспомогательных сборок с номерами версий, совпадающими с номером версии основной сборки. После того как приложение развернуто, может возникнуть необходимость обновить основную сборку или какие-либо вспомогательные сборки ресурсов. В .NET Framework поддерживается управление версиями для основной и вспомогательных сборок.
Класс SatelliteContractVersionAttribute обеспечивает поддержку управления версиями для основной сборки. Определение атрибута SatelliteContractVersionAttribute для основной сборки приложения позволяет обновлять и повторно развертывать основную сборку, не обновляя при этом вспомогательные сборки. После обновления основной сборки следует увеличить номер ее версии, не изменяя номер версии вспомогательной сборки. После того как объект ResourceManager извлекает запрошенные ресурсы, выполняется загрузка версии вспомогательной сборки, заданной этим атрибутом.
Управление версиями вспомогательных сборок обеспечивается с помощью сборок политик издателей. Можно обновлять и повторно развертывать вспомогательную сборку, не обновляя при этом основную сборку. После обновления вспомогательной сборки следует увеличить номер ее версии и включить в комплект поставки вместе со сборкой политики издателя. В сборке политики издателя необходимо указать, что новая вспомогательная сборка совместима с предыдущей версией. Несмотря на то, что для извлечения запрошенных ресурсов объект ResourceManager использует существующий номер версии вспомогательной сборки, будет извлечена обновленная версия сборки, так как загрузчик сборок выполнит привязку к версии вспомогательной сборки, указанной в сборке политики издателя. Дополнительные сведения о сборках политик издателей см. в разделе Создание файла политики издателя.
Чтобы обеспечить полную поддержку управления версиями сборок, рекомендуется размещать сборки со строгими именами в глобальном кэше сборок, а сборки с нестрогими именами – в каталоге приложения. Если сборки со строгими именами развернуты в каталоге приложения, это не позволит увеличить номер версии вспомогательной сборки после ее обновления. Вместо этого необходимо будет провести обновление "на месте", заменяя существующий код новым и сохраняя прежний номер версии. Например, если требуется обновить версию 1.0.0.0 вспомогательной сборки с полным именем "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", эту версию следует заменить обновленной сборкой myApp.resources.dll, скомпилированной с тем же самым полным именем сборки "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Следует заметить, что, поскольку номер версии не может быть увеличен, обновление файлов вспомогательных сборок "на месте" затрудняет для приложения корректное определение версии вспомогательной сборки.
Дополнительные сведения об управлении версиями сборок см. в разделах Управление версиями сборок и Обнаружение сборок в среде выполнения.
См. также
Основные понятия
Упаковка и развертывание ресурсов
Обнаружение сборок в среде выполнения
Извлечение ресурсов из файлов .Resources