* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Ресурсы и ресурсные сборки
8 февраля 2009
Большинству готовых программ требуются ресурсы. Термином «ресурсы» в данном контексте обозначают неисполняемые данные, внедренные в приложение. Пример - различные наборы строк или изображений, отображаемых пользовательским интерфейсом в зависимости от назначенной ему культуры. Упаковав подобные дан- ные в ресурсный файл, вы получите возможность заменять их без перекомпиляции приложения. В главе 8 рассказывается об автоматической генерации ресурсных файлов и сборок при создании локализованных форм. Сейчас же речь пойдет о том, как вручную создать ресурсный файл и встроить его в сборку. Вы также узнаете, как создать сборку, содержащую только ресурсы, и научитесь программно извле- кать код и объекты из таких сборок.
Создание ресурсных файлов ,N ET Framework включает приложение-пример ResEditor, которое позволяет созда- вать ресурсные файлы, содержащие текст и изображения. Это приложение не ин- тегрировано с IDE Visual Studio .NET, поэтому его следует запускать отдельно. На самом деле оно поставляется в виде исходного текста, поэтому перед использова- нием его необходимо скомпилировать. Файлы с исходным текстом вы найдете в каталоге \FrameworkSDK\Samples\Tutorials\resourcesandlocalization\reseditor, кото- рый расположен в каталоге, куда установлена Visual Studio .NET. Скомпилировать ResEditor можно при помощи командного файла, записанного в тот же катаюг, либо импортировав код в проект Visual Studio и скомпоновав его после соответствующей настройки. Примечание Если ResEditor компилируется с помощью командного файла, после- дний необходимо запускать из командной строки Visual Studio .NET — это гаранти- рует, что переменные окружения укажут путь к компилятору С#. Чтобы вызвать окно командной строки Visual Studio .NET в Microsoft Windows XP, щелкните Пуск\Программы\У15иа1 Studio .NET\Visual Studio .NET Tools. Инструмент ResEditor (его интерфейс показан на рис. 9-1) генерирует файлы с расширением .resources или .resx, содержащие строки и изображения. ResEditor позволяет назначать типы и имена ресурсам, которые вы собираетесь включить в файл. Создав запись ресурса, можно добавить к ней собственно ресурс в виде строковых значений или изображений. Завершив формирование набор;а ре- сурсов, сохраните файл в двоичном формате (в этом случае ему назначается расши- рение .resources) или как XML-файл (тогда это будет .resx-файл). > Создание файла ресурсов с помощью ResEditor 1. Скомпилируйте исходный текст ResEditor, если это еще не сделано. Файлы с исходным текстом хранятся в каталоге FrarneworkSDK\Samples\TutoriaIs\resourcesandlocalization\ reseditor, который находится в каталоге, куда установлена Visual Studio .NET. 2. Запустите ResEditor. Чтобы отредактировать существующий .resources- или .resx- файл, выберите в меню File команду Open и найдите нужный файл. 3. В раскрывающемся списке Add выберите тип добавляемого ресурса. Введите в поле Add имя нового ресурса и щелкните кнопку Add, чтобы добавить pecjpc в файл. 4. В главном окне щелкните поле рядом с именем ресурса и задайте его значение. Если это строковый ресурс, введите соответствующую строку, а если это изо- бражение, укажите файл изображения. 5. Чтобы переименовать ресурс, выделите его щелчком мыши, введите в поле но- вое имя и щелкните кнопку Rename, чтобы назначить ресурсу новое имя. Чтобы удалить ресурс, выделите его и выберите команду Delete из меню Resources. 6. Завершив редактирование файла ресурсов, шелкните команду File\Save As, что- бы сохранить его в формате .resources или .resx. Созданный .resources- или .resx-файлы можно добавить к проекту, выбрав в меню Project команду Add Existing Item. Внедрение ресурсов в сборки Созданный файл ресурсов внедряют в сборку, чтобы упаковать ресурсы вместе с использующим их кодом — это улучшает переносимость приложения и уменьшает его зависимость от внешних файлов. Для этого достаточно всего добавить файл ре- сурсов к проекту приложения — добавленные ресурсы будут включены в сборку при компиляции проекта. • ^ Как внедрить ресурсы в сборку 1. Создайте файл ресурсов в формате .resources или .resx. Это удобно сделать с по- мощью ResEditor. 2. В меню Project выберите команду Add Existing Item — откроется одноименное окно. 3. Найдите файл ресурсов и щелкните кнопку Open — файл добавляется к проекту. 4. Из меню Build выберите команду Build, чтобы скомпилировать приложение, - создается сборка, в которую внедряются выбранные ресурсы. Создание ресурсных сборок Допустимо создавать сборки, содержащие только ресурсы. Это удобно, когда ре- сурсы нужно часто менять, но не хотелось бы перекомпилировать из-за этого все приложение. Чтобы создать ресурсную сборку, добавьте файл ресурсов в пустой проект. При компоновке такого проекта создается сборка, содержащая исключительно ресурсы, которые можно применять в других сборках, ссылаясь на них в коде. Как получить доступ к ресурсам такой сборки — рассказано далее. > Как создать ресурсную сборку 1. В меню File выберите команду New\Project — откроется окно New Project. 2. В этом окне выберите Visual Basic Projects или Visual C# Projects, затем Empty Project и щелкните OK — будет создан пустой проект. 3. В меню Project выберите команду Add Existing Item, чтобы добавить к новому проекту нужные файлы с ресурсами. 4. В окне Solution Explorer щелкните правой кнопкой этот проект и выберите из контекстного меню команду Properties — откроется окно свойств проекта. 5. В меню Output Type выберите для проекта выходной тип Class Library. 6. В меню Build выберите В\л\\<1\<имя_проекта> — выполняется компиляция ре- сурсов в сборку. Создание сопутствующих сборок При создании приложений с многоязычным интерфейсом удобно использовать для каждой из поддерживаемых культур отдельный набор ресурсов. Это возможно бла- годаря сопутствующим сборкам (satellite assemblies), позволяющих автоматически загружать тот или иной набор ресурсов в зависимости от значения свойства Current- UlCulture потока. Из главы 8 вы узнали, как автоматически генерировать файл ре- сурсов для локализованной версии приложения, здесь же рассказывается о созда- нии и подключении сопутствующих сборок для поддерживаемых культур. В Visual Studio .NET создать сопутствующую сборку очень просто: достаточно добавить к приложению соответствующим образов названный файл с альтернатив- ным набором ресурсов — остальное сделает Visual Studio .NET при компиляции проекта. Имя файла ресурсов, встраиваемого в сопутствующую сборку, определяется культурой, для поддержки которой эти ресурсы предназначены. Оно составляется из имени файла с ресурсами для культуры по умолчанию, кода соответствующей культуры и расширения. Так, если файл ресурсов называется My Resources, resx, файл с ресурсами для поддержки немецкой культуры (для любых регионов) и именуется MyResources.de.resx, а для люксембургского варианта немецкого языка — My Resources. de-LU. resx. Если добавить эти файлы к приложению, Visual Studio .NET автоматически скомпилирует их в сопутствующие сборки и поместит их соответствующие катало- ги. Во время выполнения CLR автоматически загружает специфичные для культу- ры ресурсы, хранящиеся в этих файлах. > Как создать сопутствующую сборку 1. Создайте файлы с альтернативными ресурсами для каждого из регионов, в кото- рых предполагается использовать приложение. 2. Имя сопутствующей сборки должно включать имя файла ресурсов для культуры по умолчанию и код культуры, разделенные точкой. 3. В меню Project выберите команду Add Exiting Item, чтобы добавить к проекту созданные файлы. 4. Выберите из меню Build команду Build Solution, чтобы скомпоновать решение, 5. Файлы с ресурсами, специфичными для культуры, автоматически компилиру- ются в сопутствующие сборки, которые записываются в соответствующие ката- логи. Извлечение ресурсов во время выполнения Для извлечения внедренных ресурсов во время выполнения применяется класс Resource Manager, управляющий доступом и извлечением ресурсов из сборок. Каж- дый экземпляр класса Resource Manager связан со сборкой, содержащей ресурсы. Конструктор класса Resource Manager требует два параметра: имя внедренного файла ресурсов (без расширения) и сборку, в которой он находится. Созданный экземпляр Resource Manager связывается с заданным файлом ресурсов, внедренным в сборку, имя этого файла (опять же без расширения) становится именем простран- ства имен, открывающего доступ к содержимому файла. Вот, например, как выгля- дит ссылка на ресурсы из файла my Re sou rces.de-DE. resx, расположенные в про- странстве имен Namespacel, — NamespaceLmyResources. Второй параметр указывает сборку, в которой расположен данный файл ресур- сов. Если это та же сборка, в которой находится объект, создающий экземпляр ResourceManager, можно получить ссылку на нее через тип этого объекта, например: Visual Basic .NET ' Создание экземпляра ResourceManager для доступа к ресурсам из 1 файла myResources. resx, расположенным в пространстве имен myNarnespace 1 и внедренным в ту же сборку, что и текущий объект. 1 Пример предполагает наличие оператора Imports System.Resources. Dim myManager As New ResourceManager("myNamespace.myResources", Me.GetType.Assembly) Visual C# // Создание экземпляра ResourceManager для доступа к ресурсам из // файла myResources. resx, расположенным в пространстве имен myNarnespace // и внедренным в ту же сборку, что и текущий объект, // Пример предполагает наличие оператора, импортирующего System.Resources. ResourceManager myManager = new ResourceManager ("myNamespace.myResources", this,GetType().Assembly); Если требуемые ресурсы находятся в другой сборке (например, в отдельной ре- сурсной сборке), перед извлечением ресурсов эту сборку необходимо загрузить. Сборки загружают при помогли экземпляра класса Assembly из пространства имен System. Reflection: Visual Basic. NET Пример предполагает наличие оператора Imports System.Resources Dim myResources As System.Reflection.Assembly Метод Assembly.Load принимает в качестве параметра HMR загружаемой сборки. myResources = System,Reflection.Assembly,Load("ResourceAssembly") Dim myManager As New ResourceManager("ResourceAssembly,Resources", myResources) Visual C# // Пример предполагает наличие оператора, импортирующего System.Resources System.Reflection.Assembly myResojrces; // Метод Assembly.Load принимает в качестве параметра // имя загружаемой сборки. myResources - System. Reflect ion. Assembly. Load("ResourceAssernbly"); ResourceManager myManager = new ResourceManager("ResourceAssembly. Resources", myResources): Примечание Прежде чем загружать сборку, необходимо добавить к проекту ссылку на нее. Созданный объект-диспетчер ресурсов применяют для извлечения из файла ре- сурсов строк и объектов, Для извлечения строк применяют метод ResourceManager. GetString, требующий имя извлекаемого ресурса, Метод Resource Manager. GelObject позволяет извлекать изображения и другие объекты. Он возвращает объект с заданным именем. Извлеченный объект необхо- димо явно преобразовать в требуемый тип. Вот как извлечь изображение: Visual Basic .NET Этот пример предполагает наличие экземпляра класса ResourceManager с именем myManager. Dim (nyImage As System. Drawing. Image mylrriage = CType(myManager.GetObject("IinageResource"), System.Drawing.Image) Visual C# // Этот поимер предполагает наличие экземпляра класса ResoyceManager // с именем myManager. System.Drawing.Image mylmage; mylmage - (System. Drawing. Image)rr.yHanager.GetObject("Imageflesource");