Для чего используются файлы ресурсов
WPF позволяет обращаться к скомпилированным ресурсам (вроде BAML-файла для страницы) с помощью синтаксиса . В предыдущей статье в элементе Image и дескрипторе для ссылки на ресурс использовался относительный URI:
Эквивалентный ему более громоздкий абсолютный URI показан ниже:
Такой абсолютный URI можно использовать при установке источника изображения, хотя никаких дополнительных преимуществ это не даст.
В случае применения абсолютного URI можно использовать путь к файлу, UNC-путь к сетевому ресурсу, URL-адрес веб-сайта или упакованный URI, указывающий на ресурс сборки. Главное помнить о том, что если приложению не удастся извлечь ресурс из указанного места, сгенерируется исключение. Если URI был установлен в XAML, исключение сгенерируется на этапе создания страницы.
Синтаксис упакованного URI был позаимствован из стандарта XPS (XML Paper Specification). Причина его странного внешнего вида заключается в том, что он подразумевает вставку одного URI внутрь другого. Три запятых фактически представляют собой три отмененных косых черты. Другими словами, показанный выше упакованный URI содержит URI приложения, начинающийся с конструкции application://.
Файлы содержимого
При добавлении файла в виде ресурса его следует поместить в скомпилированную сборку и удостовериться в том, что он будет доступен всегда. Такой подход является идеальным вариантом для развертывания и исключает возможные проблемы. Однако в некоторых ситуациях он непрактичен, а именно:
при желании изменить файл ресурса без повторной компиляции приложения;
когда файл ресурса имеет очень большой размер;
когда файл ресурса является необязательным и может не развертываться со сборкой;
когда ресурс представляет собой звуковой файл.
Звуковые классы WPF не поддерживают ресурсов сборки. По этой причине способа для извлечения аудиофайла из потока ресурсов и его воспроизведения не существует — по крайней мере, без его предварительного сохранения. Таково ограничение лежащих в основе технологии компонентов, на которых основаны данные классы (а именно — интерфейса Win32 API и проигрывателя Media Player).
Очевидно, что обойти эту проблему можно путем развертывания файлов вместе с приложением и добавления в приложение соответствующего кода для чтения этих файлов с жесткого диска. Однако WPF имеет удобную опцию, которая может упрощать выполнение этого процесса и заключается в специальной маркировке таких не скомпилированных файлов как файлов содержимого.
Файлы содержимого в сборку не встраиваются. Тем не менее, WPF добавляет к сборке атрибут AssemblyAssociatedContentFile, который объявляет о существовании каждого файла содержимого. Этот атрибут также записывает информацию о размещении каждого файла содержимого по отношению к исполняемому файлу (показывая, находится ли файл содержимого в той же папке, что и исполняемый файл, или же в отдельной подпапке). Лучше всего то, что для использования файлов содержимого с элементами, умеющими работать с ресурсами, можно применять ту же самую систему URI.
Чтобы проверить это, добавьте в свой проект какой-то звуковой файл, выделите его в окне Solution Explorer и измените значение свойства Build Action в окне Properties на Content (содержимое). Удостоверьтесь в том, что для параметра Copy to Output Directory (Копировать в выходной каталог) установлено значение Copy Always (Копировать всегда), чтобы звуковой файл копировался в каталог вывода при компоновке проекта.
Теперь можно использовать относительный URI, чтобы указать MediaElement на свой файл содержимого:
Все управляемые ресурсы, которые нужно редактировать, должны быть связанными ресурсами. Редакторы ресурсов Visual Studio не поддерживают редактирование внедренных ресурсов.
Термин файл ресурсов может ссылаться на любой из нескольких типов файлов, например:
Файл скрипта ресурсов ( .rc ) программы.
Файл шаблона ресурсов ( .rct ).
Отдельный ресурс, существующий как отдельный файл. Этот тип включает точечный рисунок, значок или файл курсора, на .rc который ссылается файл.
Файл заголовка, созданный средой разработки. Этот тип включает Resource.h , на .rc который ссылается файл.
Другие типы файлов, такие как .exe , .dll и .res , могут также содержать ресурсы, к которым можно получить доступ, хотя первые два обычно не считаются файлами ресурсов.
В проекте можно работать с файлами ресурсов и ресурсами . Вы также можете работать с ресурсами и файлами ресурсов, которые не являются частью текущего проекта или были созданы вне среды разработки Visual Studio. Например, администратор может сделать следующее:
Работать с вложенными и условно включенными файлами ресурсов.
Обновите существующие ресурсы или преобразуйте их в Visual C++.
Импортировать графические ресурсы в текущий файл ресурсов или экспортировать их из него.
Включать общие или доступные только для чтения идентификаторы (символы), которые нельзя изменить с помощью среды разработки.
Включите ресурсы в исполняемый файл ( .exe или .dll ), который не нуждается в редактировании (или не следует изменять), например общие ресурсы между несколькими проектами.
Включать типы ресурсов, не поддерживаемые средой разработки.
Утилита Resgen.exe
Для создания из ***.txt файла ресурсов можно воспользоваться специальной утилитой генерации файлов ресурсов Resgen.exe. Например, ввод следующей команды:
приведет к созданию файла MyResources.resources. Сгенерированный этой утилитой файл ресурсов далее можно либо добавить в сборку как внешний файл, либо вставить в сборку DLL или ЕХЕ. Утилита Resgen также поддерживает возможность создания файлов ресурсов в формате XML с расширением .resX. Применяется она очень просто:
Выполнение этой команды приведет к созданию XML-файла ресурсов по имени MyResources.resX.
Утилита Resgen поддерживает строго типизированные ресурсы. Строго типизированный ресурс представляется в виде класса, который получает доступ к ресурсам. Для создания такого класса в утилите Resgen предусмотрена опция /str:
После опции /str должен быть указан язык, пространство имен, имя класса и имя файла исходного кода, причем именно в таком порядке.
Ресурсы манифеста
В проектах классических приложений C++ Ресурсы манифеста представляют собой XML-файлы, описывающие зависимости, используемые приложением. например, в Visual Studio файл манифеста, созданный мастером MFC, определяет версию Windows общих библиотек управления, которые приложение должно использовать:
для приложения Windows XP или Windows Vista ресурс манифеста должен указывать самую последнюю версию Windows стандартных элементов управления для использования приложением. В приведенном выше примере используется версия 6.0.0.0 , которая поддерживает Syslink элемент управления.
Допускается иметь только один ресурс манифеста на каждый модуль.
чтобы просмотреть сведения о версии и типе, содержащиеся в ресурсе манифеста, откройте файл в средстве просмотра XML-файлов или Visual Studio текстовом редакторе. Если вы откроете ресурс манифеста из представления ресурсов, этот ресурс откроется в двоичном формате.
Ресурсы манифеста
В проектах классических приложений C++ Ресурсы манифеста представляют собой XML-файлы, описывающие зависимости, используемые приложением. например, в Visual Studio файл манифеста, созданный мастером MFC, определяет версию Windows общих библиотек управления, которые приложение должно использовать:
для приложения Windows XP или Windows Vista ресурс манифеста должен указывать самую последнюю версию Windows стандартных элементов управления для использования приложением. В приведенном выше примере используется версия 6.0.0.0 , которая поддерживает Syslink элемент управления.
Допускается иметь только один ресурс манифеста на каждый модуль.
чтобы просмотреть сведения о версии и типе, содержащиеся в ресурсе манифеста, откройте файл в средстве просмотра XML-файлов или Visual Studio текстовом редакторе. Если вы откроете ресурс манифеста из представления ресурсов, этот ресурс откроется в двоичном формате.
Ресурсы в других сборках
Упакованные URI также позволяют извлекать ресурсы, находящиеся в другой библиотеке (другими словами, в DLL-сборке, которую использует приложение). В таком случае должен использоваться следующий синтаксис:
Например, если изображение находится в ссылаемой сборке по имени ImageLibrary, потребуется использовать такой URI:
Если применяется сборка со сложным именем, имя сборки можно заменить уточненной ссылкой на сборку, включающей версию, маркер открытого ключа либо то и другое вместе. Каждый фрагмент информации следует отделить точкой с запятой, а перед номером версии добавить букву v. Ниже показан пример:
Использование файлов ресурсов
Добавьте в этот проект созданный ранее файл ресурсов Demo.resx, открыв в окне Solution Explorer контекстное меню и выбрав в нем пункт Add --> Add Existing Item (Добавить --> Добавить существующий элемент). По умолчанию для свойства Build Action (Действие при компоновке) этого ресурса будет установлено значение Embedded Resource (Встраиваемый ресурс), указывающее, что этот ресурс должен встраиваться в выходную сборку.
Далее в параметрах проекта (за счет выбора Application --> Assembly information (Приложение --> Информация о сборке)) следует установить в качестве значения параметра Neutral Language (Нейтральный язык) основной язык:
Изменение значения этого параметра приведет к добавлению в файл assemblyinfо.cs атрибута [NeutralResourceLanguageAttribute], как показано ниже:
Установка значения для данного атрибута улучшит производительность ResourceManager, поскольку позволит ему быстрее отыскивать ресурсы для en-US, а также использовать их в качестве варианта по умолчанию. В этом атрибуте можно также указать место размещения используемого по умолчанию ресурса за счет применения второго параметра в конструкторе. С помощью перечисления UltimateResourceFallbackLocation можно указать, что он должен размещаться в главной сборке (значение MainAssembly) или же в подчиненной (значение Satellite).
После компоновки проекта можно просмотреть сгенерированную сборку утилитой ildasm и увидеть в манифесте атрибут, .mresource. Атрибут .mresource объявляет имя для ресурса в сборке. Если .mresource объявлен public (как в данном примере), это означает, что ресурс может экспортироваться из сборки и использоваться в классах других сборок. Если же .mresource объявлен private, это значит, что ресурс экспортироваться не может и доступен только в пределах данной сборки.
Для получения доступа к встроенному ресурсу используется класс ResourceManager, который находится в пространстве имен System.Resources. Конструктору этого класса в качестве аргумента можно передать имя сборки, в которой содержатся ресурсы.
В рассматриваемом примере ресурсы встроены в исполняемую сборку, поэтому во втором аргументе конструктору должен быть передан результат выполнения метода Assembly.GetExecutingAssembly(). В первом аргументе передается корневое имя ресурсов, состоящее из названия пространства имен и имени файла ресурсов, но без расширения resources. Как было показано ранее, это имя можно отобразить с помощью утилиты ildasm и просто удалить из него расширение resources. Имя можно также получить и программно с применением метода GetManifestResourceNames() класса System.Reflection.Assembly:
Для создания строго типизированного ресурса в редакторе управляемых ресурсов (Managed Resources Editor) можно изменить значение параметра Access Modifier (Модификатор доступа) с No Code Generation (Не генерировать никакой код) на Public (Общедоступный) или Internal (Внутренний). В случае установки значения Public генерируемый класс снабжается модификатором доступа public и тогда к нему возможен доступ из других сборок. При установке значения Internal генерируемый класс получает модификатор доступа internal и доступ к нему может осуществляться только изнутри сборки, в которой он находится.
Пространство имен System.Resources
Давайте кратко пройдемся по всем классам, которые содержатся в пространстве имен System.Resources и позволяют работать с ресурсами.
Класс ResourceManager
Может использоваться для получения ресурсов, относящихся к текущей культуре, из сборок или файлов ресурсов. С помощью ResourceManager можно получать сразу целый набор ресурсов для определенной культуры в виде экземпляра ResourceSet.
Класс ResourceSet
Позволяет представлять набор ресурсов для определенной культуры. При создании экземпляр ResourceSet он производит перечисление по классу, реализуя интерфейс IResourceReader, и сохраняет все ресурсы в HashTable.
Интерфейс IResourceReader
Используется в ResourceSet для перечисления ресурсов. Класс ResourceReader реализует этот интерфейс.
Класс ResourceWriter
Применяется для создания файла ресурсов и реализует интерфейс IResourceWriter.
Классы ResXResourceSet, ResXResourceReader и ResXResourceWriter
Похожи на классы ResourceSet, ResourceReader и ResourceWriter, но служат для создания не бинарного файла ресурсов, а не XML-файла .resx. Вместо того чтобы встраивать ресурс в XML-файл, они позволяют добавлять на него ссылку с помощью ResXFileRef.
Пространство имен System.Resources.Tools
Содержит класс StronglyTypedResourceBuilder, который можно использовать для создания класса из ресурса.
Изменяемые ресурсы
Чтобы изменить содержащиеся в них ресурсы, можно открыть следующие типы файлов:
Имя файла | Описание |
---|---|
.rc | Файлы скриптов ресурсов |
.rct | Файлы шаблонов ресурсов |
.res | Файлы ресурсов |
.resx | Управляемые файлы ресурсов |
.exe | Исполняемые файлы |
.dll | Файлы библиотек динамической компоновки |
.bmp , .ico , .dib , .cur | Точечные рисунки, значки, панели инструментов и файлы курсоров |
среда Visual Studio работает с и влияет на следующие файлы при редактировании ресурсов:
Редакторы ресурсов напрямую не читают и не считывают .rc файлы Resource. h. Компилятор ресурсов компилирует их в .aps файлы, используемые редакторами ресурсов. Этот файл представляет собой этап компиляции и содержит только символьные данные.
Как и в случае обычного процесса компиляции, сведения, не являющиеся символьными, например комментарии, удаляются в процессе компиляции.
.aps Если файл не синхронизирован с .rc файлом, .rc файл создается повторно. Например, при сохраненииредактор ресурсов перезаписывает .rc файл и resource.h файл. Любые изменения в ресурсах остаются включенными в .rc файл, но комментарии всегда теряются после .rc переписывания файла. Сведения о том, как сохранять комментарии, см. в разделе Включение ресурсов во время компиляции.
Открытие ресурса манифеста
откройте проект в Visual Studio и перейдите к Обозреватель решений.
Разверните папку файлы ресурсов , а затем:
Чтобы открыть в текстовом редакторе, дважды щелкните .manifest файл.
Чтобы открыть в другом редакторе, щелкните .manifest файл правой кнопкой мыши и выберите команду Открыть с помощью. Укажите используемый редактор и нажмите кнопку Открыть.
Рано или поздно любой человек, программирующий под Windows (имеется в виду платформа Win32), сталкивается с необходимостью работы с ресурсами. Когда настанет этот момент - в первую очередь, зависит от среды разработки и библиотек, которыми программист пользуется. Некоторые ориентированы на работу непосредственно с ресурсами с самого начала, другие же позволяют в большинстве случаев обойтись и без них. Однако когда возникает необходимость отредактировать какой-то ресурс, как раз последние среды разработки не могут похвастаться удобными редакторами. В этой статье, как вы, наверное, уже догадались, мы поговорим о ресурсах. И о том, как с ними можно работать с максимальным комфортом.
Что такое ресурсы
Если вы уже достаточно программировали под Win32, то не можете не знать, что такое ресурсы. Однако у начинающих программистов этот термин нередко вызывает вопросы, поэтому, думаю, будет нелишним напомнить (или объяснить), что мы имеем в виду, когда говорим "ресурс".
Ресурсы - это данные, помещённые в специально отведённую для них область исполняемого файла. Как известно, исполняемые файлы могут содержать не только программный код, но и данные. В ОС такие файлы Windows разбиты на секции. Если данные находятся в секции, отведённой для ресурсов, значит, это ресурсы. Чем ресурсы отличаются от любых остальных данных внутри EXE-файла? Собственно, только тем, что система предоставляет программисту специальные функции для работы с ними.
Традиционно выделяют разные типы ресурсов. К стандартным относятся значки (иконки), курсоры для мыши, bitmap-картинки, строки и таблицы строк, комбинации "горячих" клавиш (accelerators), меню, диалоговые окна и информация о версии приложения. Существует также специальный тип ресурсов под названием RCDATA, позволяющий добавить в программу любые данные, не подходящие под приведенную выше классификацию, и работать с ними тоже как с обычными ресурсами.
Для чего они нужны
"Классическое" программирование под Win32, давно ставшее анахронизмом, предусматривает такой подход к созданию приложений, при котором ресурсы используются более чем интенсивно. Однако в большинстве сред разработки, с которыми поставляются фирменные библиотеки для создания пользовательского интерфейса, ресурсы задействованы не совсем так, как предлагали создатели операционной системы. Например, в Borland Delphi и C++ Builder все формы (окна) и всё, что на них, включая меню и таблицы "горячих" клавиш, находятся в секции RCDATA в виде специального текстового описания формы.
Собственно, в связи с этим может возникнуть один довольно здравый вопрос: а в чём вообще смысл использования ресурсов? Ведь можно прекрасно создать меню и диалоговые окна прямо по ходу работы приложения, с помощью стандартных функций Win32 API. Зачем же усложнять всё, создавая сначала ресурсы, а уже после вызывая их из приложения? Ответ довольно прост. Вынесение всех описанных выше видов ресурсов в отдельную часть исполняемого файла облегчает задачу по их изменению в уже скомпилированной программе. Согласитесь, изменить содержимое ресурса с помощью специального редактора намного легче, чем её дизассемблировать и менять ассемблерный код. Однако тут же возникает ещё один вопрос, тоже вполне логичный. Зачем может понадобиться изменение ресурсов? Самый простой пример - локализация программы. Для перевода интерфейса программы на другой язык достаточно воспользоваться редактором ресурсов, причём сделать это может даже человек, достаточно далёкий от программирования. А пользователи любят локализованные программы.
Инструментарий
Для работы с ресурсами, естественно, нужен специальный инструментарий. Его можно разделить на несколько видов: WYSIWYG 1 -редакторы ресурсов, компиляторы ресурсов и редакторы ресурсов, которые работают с исполняемыми файлами.
До того, как ресурс попадёт в исполняемый файл, он может пребывать в двух состояниях: в виде скрипта или в виде скомпилированного файла ресурсов. Файлы со скриптами - текстовые файлы с расширением RC, имеющие внутри себя текст на языке Resource Script. Компиляторы ресурсов преобразуют скрипты в двоичный формат, с которым умеют работать компоновщики исполняемых файлов. Компилятор ресурсов есть практически в каждом пакете для программирования. Например, в GNU Compiler Collection для Windows этот компилятор называется Windres.exe.
С WYSIWYG-редакторами работать, конечно же, на порядок проще, чем писать скрипты в блокноте. Картинки в них рисовать, естественно, не так удобно, как в Adobe Photoshop, но в плане редактирования меню, диалогов, да и иконок с курсорами всё не так уж и плохо. В них ресурсы можно редактировать, как правило, и в виде скриптов, и в скомпилированном двоичном виде. Таких программ, к счастью тоже немало. Наиболее хорошо знаком программистам, пожалуй, редактор ресурсов из Microsoft Visual Studio. Есть также Borland Resource Workshop, которому сто лет в обед, а в последних версиях сред разработки от Borland его уже не видно и не слышно.
Программы, которые умеют работать с ресурсами в исполняемых файлах, как правило, тоже имеют некоторые зачатки WYSIWYG. Дальше всех в этом направлении продвинулся Resource Hacker, но и остальные тоже не так уж плохи.
Resource Builder от SiComponents
А сейчас я хотел бы рассказать о программе, которая в приведенной классификации попадает сразу во все три категории и имеет как WYSIWYG-дизайнер, так и компилятор ресурсов. Умеет при этом работать и со скриптами, и с двоичными файлами ресурсов, и с исполняемыми файлами. Название программы, как вы уже догадались, - ResourceBuilder, а найти в интернете её можно по адресу www.resource-builder.com или www.sicomponents.com. Программа, правда, платная, но это, пожалуй, тот самый случай, когда продукт действительно заслуживает сотни "вечнозелёных", которую за него просят разработчики.
После скачивания пробной версии и её установки вы сможете запустить программу и увидеть примерно то же самое, что содержит скриншот к статье. В целом, по моему скромному мнению, интерфейс достаточно удобный и симпатичный.
Разработчики Resource Builder'а утверждают, что это единственный WYSIWYG-редактор ресурсов, поддерживающий Unicode-ресурсы, в том числе и RC-скрипты в этой кодировке. Кроме того, программа поддерживает и 16-битные, и 32-битные скомпилированные файлы ресурсов, аналогично и исполняемые файлы. Также присутствует поддержка изменения ресурсов без перекомпиляции исполняемого файла, которая, по существу, является стандартной и реализована во многих программах, однако это ничуть не умаляет полезности данной функции. Что интересно, Resource Builder умеет работать и с ресурсами компонентов Delphi/C++ Builder.
Графический редактор, встроенный в Resource Builder, по своим возможностям просто-таки близнец Paint'а. В то же время, в отличие от многих других редакторов, он поддерживает редактирование изображений любого размера и с любой глубиной цвета. В справке написано, что программа умеет работать не только со стандартными BMP-картинками, но и с изображениями в формате JPEG. Однако с такими ресурсами нельзя будет работать теми же системными средствами, что и с BMP, поэтому лично мне эта возможность не кажется такой уж полезной.
Зато интересная особенность Resource Builder'а - поддержка работы с формами Delphi и C++ Builder. С ними можно работать в текстовом виде, причём редактор имеет подсветку синтаксиса для них. А если у вас на компьютере установлены Delphi 6 или 7, или же C++ Builder 6, то можно воспользоваться их средствами для визуального редактирования форм. Если при этом указать все дополнительные компонентные библиотеки (BPL), то работа с формами будет совсем комфортной.
С редактированием стандартных диалоговых ресурсов тоже никаких проблем нет. Resource Builder поддерживает как стандартные элементы, предоставляемые Windows, так и позволяет осуществить подключение сторонних библиотек с элементами управления. Причём одна такая библиотека поставляется вместе с самим Resource Builder'ом. Она, правда, небольшая и содержит всего две кнопки, но зато снабжена исходными текстами, так что каждый желающий сможет создать на её основе свою библиотеку элементов управления.
Вместе с Resource Builder поставляется и консольный компилятор ресурсных скриптов, поэтому те, кто хочет компилировать ресурсы из командной строки, также будут иметь возможность это сделать. Языковые возможности компилятора полностью совпадают с возможностями визуального редактора ресурсов, так что все ресурсные скрипты, созданные с помощью Resource Builder'а, полностью с ним совместимы.
Ресурсы в программе можно поместить в специальную ресурсную DLL-библиотеку, причём для того, чтобы сделать это, не требуется никаких сторонних инструментов. Одним движением руки в программу или в ресурсный файл можно добавить XP Manifest (специальный ресурс, обеспечивающий поддержку визуальных стилей Windows XP). Для удобства пользователя в Resource Builder'е имеется поддержка многоязычного интерфейса, причём русский язык включён в дистрибутив пробной версии программы. Также стоит отметить присутствие "Мастера настроек", который можно в любой момент вызвать из меню "Инструменты". С его помощью можно быстро настроить самое важное, не вникая в детали всех настроек, которых в Resource Builder'е не так уж и мало.
Таким образом, в качестве подведения итогов хочу сказать, что Resource Builder - самый качественный из встреченных мною инструментов для работы с ресурсами. В этом он может дать фору даже такому монстру, как Visual Studio. А уж о таких программах, как Borland Resource Workshop или Borland Image Editor, и говорить нечего. Поэтому рекомендую его всем, кто страдает от недостатков того редактора ресурсов, которым пользуется.
Вадим СТАНКЕВИЧ
1 WYSIWYG - What You See Is What You Get, т.е. в редакторе всё выглядит так же, как будет выглядеть при работе программы
Прежде чем посмотреть, как применять ресурсы для локализации приложений, сначала ознакомимся с методами создания и чтения ресурсов без принятия во внимание языковых аспектов.
Открытие ресурса манифеста
откройте проект в Visual Studio и перейдите к Обозреватель решений.
Разверните папку файлы ресурсов , а затем:
Чтобы открыть в текстовом редакторе, дважды щелкните .manifest файл.
Чтобы открыть в другом редакторе, щелкните .manifest файл правой кнопкой мыши и выберите команду Открыть с помощью. Укажите используемый редактор и нажмите кнопку Открыть.
Все управляемые ресурсы, которые нужно редактировать, должны быть связанными ресурсами. Редакторы ресурсов Visual Studio не поддерживают редактирование внедренных ресурсов.
Термин файл ресурсов может ссылаться на любой из нескольких типов файлов, например:
Файл скрипта ресурсов ( .rc ) программы.
Файл шаблона ресурсов ( .rct ).
Отдельный ресурс, существующий как отдельный файл. Этот тип включает точечный рисунок, значок или файл курсора, на .rc который ссылается файл.
Файл заголовка, созданный средой разработки. Этот тип включает Resource.h , на .rc который ссылается файл.
Другие типы файлов, такие как .exe , .dll и .res , могут также содержать ресурсы, к которым можно получить доступ, хотя первые два обычно не считаются файлами ресурсов.
В проекте можно работать с файлами ресурсов и ресурсами . Вы также можете работать с ресурсами и файлами ресурсов, которые не являются частью текущего проекта или были созданы вне среды разработки Visual Studio. Например, администратор может сделать следующее:
Работать с вложенными и условно включенными файлами ресурсов.
Обновите существующие ресурсы или преобразуйте их в Visual C++.
Импортировать графические ресурсы в текущий файл ресурсов или экспортировать их из него.
Включать общие или доступные только для чтения идентификаторы (символы), которые нельзя изменить с помощью среды разработки.
Включите ресурсы в исполняемый файл ( .exe или .dll ), который не нуждается в редактировании (или не следует изменять), например общие ресурсы между несколькими проектами.
Включать типы ресурсов, не поддерживаемые средой разработки.
Изменяемые ресурсы
Чтобы изменить содержащиеся в них ресурсы, можно открыть следующие типы файлов:
Имя файла | Описание |
---|---|
.rc | Файлы скриптов ресурсов |
.rct | Файлы шаблонов ресурсов |
.res | Файлы ресурсов |
.resx | Управляемые файлы ресурсов |
.exe | Исполняемые файлы |
.dll | Файлы библиотек динамической компоновки |
.bmp , .ico , .dib , .cur | Точечные рисунки, значки, панели инструментов и файлы курсоров |
среда Visual Studio работает с и влияет на следующие файлы при редактировании ресурсов:
Редакторы ресурсов напрямую не читают и не считывают .rc файлы Resource. h. Компилятор ресурсов компилирует их в .aps файлы, используемые редакторами ресурсов. Этот файл представляет собой этап компиляции и содержит только символьные данные.
Как и в случае обычного процесса компиляции, сведения, не являющиеся символьными, например комментарии, удаляются в процессе компиляции.
.aps Если файл не синхронизирован с .rc файлом, .rc файл создается повторно. Например, при сохраненииредактор ресурсов перезаписывает .rc файл и resource.h файл. Любые изменения в ресурсах остаются включенными в .rc файл, но комментарии всегда теряются после .rc переписывания файла. Сведения о том, как сохранять комментарии, см. в разделе Включение ресурсов во время компиляции.
Создание файлов ресурсов
В файлах ресурсов могут храниться элементы, подобные изображениям и таблицам строк. В качестве ресурсного файла может быть обычный текстовый файл или файл с расширением .resX, в котором используется XML. В этой статье сначала рассматривается вариант простого текстового файла.
Ресурс, включающий в себя таблицу строк, может создаваться в обычном текстовом файле. В этом файле просто производится назначение строк ключам. Под ключом понимается имя, которое может использоваться в программе для получения соответствующего значения. В ключах и значениях допускается использовать пробелы.
Ниже показан пример создания простой таблицы строк:
Класс ResourceWriter
Вместо использования для создания файлов ресурсов утилиты Resgen можно написать специальную, позволяющую это делать программу. Класс ResourceWriter из пространства имен System.Resources служит для создания бинарных файлов ресурсов, а класс ResXResourceWriter — для создания файлов ресурсов на базе XML. Оба эти класса поддерживают возможность добавления изображений и любых других сериализуемых объектов. В случае применения класса ResXResourceWriter потребуется сослаться на сборку System.Windows.Forms.
В следующем примере кода демонстрируется создание объекта ResXResourceWriter по имени rw в файле Demo.resx. После создания экземпляра с помощью метода AddResource() класса ResXResourceWriter можно приступать к добавлению набора ресурсов общим объемом до 2 Гбайт. Первый аргумент в AddResource() позволяет указывать имя ресурса, а второй — значение. Ресурс изображения можно добавлять за счет применения экземпляра класса Image. Чтобы можно было использовать класс Image, необходимо сослаться на сборку System.Drawing, а также добавить директиву using для открытия пространства имен System.Drawing.
Здесь объект Image создается за счет открытия файла logo.jpg, поэтому потребуется либо скопировать этот файл изображения в каталог исполняемой программы, либо указать полный путь к нему в аргументе метода ImageToFile(). Оператор using указывает, что ресурс изображения должен автоматически уничтожаться в конце блока using.
Далее в объект ResXResourceWriter добавляются простые строковые ресурсы. В конце метод Close() класса ResXResourceWriter автоматически вызывает ResXResourceWriter.Generate() для осуществления записи ресурсов в файл Demo.resx:
Запуск этой небольшой программы приведет к созданию файла ресурсов Demo.resx с изображением logo.jpg внутри.
Читайте также: