Руководство

Как преобразовать файлы .resx и .resources в собственные ресурсы Win32

Опубликовано

Если у вас есть ресурсы в файле .NET .resx или .resources и они нужны в неуправляемом проекте, установщике или сборке на основе RC, требуется этап преобразования. Resource Builder выполняет его одной командой: изображения превращаются в настоящие ресурсы BITMAP, ICON и CURSOR, а всё остальное сохраняется как именованные RCDATA с неизменными байтами.

Эта статья описывает направление от .resx/.resources к собственным ресурсам. Если же вы хотите отредактировать файл .resx или сравнить два таких файла, см. руководства по редактированию файлов ресурсов .NET и сравнению ресурсов.

Что получается при преобразовании

-conv сопоставляет каждую запись .NET с собственным ресурсом:

Запись .NET

Собственный результат

Bitmap

настоящий ресурс BITMAP

Icon

настоящий ресурс ICON (запись с несколькими размерами становится GROUP_ICON и её элементами ICON)

Cursor

настоящий ресурс CURSOR

String, Boolean, Byte, Int16/32/64, Byte Array или любой непрозрачный тип CLR

ресурс RCDATA с именем записи .NET, содержащий её исходные байты без изменений

Две формы вывода:

  • .res — скомпилированный двоичный файл ресурсов, готовый к компоновке.
  • .rc — обычный скрипт ресурсов. Байты каждой записи встроены в виде шестнадцатеричного текста, поэтому скрипт полностью самодостаточен: не нужно хранить рядом файлы изображений или данных. Его можно открыть, прочитать, отредактировать и скомпилировать любым компилятором RC.

Преобразование из командной строки

Консольный инструмент — sircc64.exe. Основное приложение Resbldr5.exe принимает тот же синтаксис -conv.

Между .resx и .resources

sircc64.exe -conv Strings.resx Strings.resources

Направление определяется по расширениям файлов. Если не указывать имя выходного файла, автоматически используется противоположное расширение:

sircc64.exe -conv Strings.resx

В собственный .res

sircc64.exe -conv App.resx App.res

Созданный скрипт компилируется внутри программы, и записывается только .res.

В собственный скрипт .rc

sircc64.exe -conv App.resx App.rc

Записывается сам скрипт, нескомпилированный. Чтобы убедиться в его корректности, скомпилируйте его и сравните:

sircc64.exe -c App.rc App-from-rc.res

App-from-rc.res побайтово совпадает с .res, который напрямую создаёт -conv ... App.res.

Пакетное преобразование

Пакетный режим в настоящее время поддерживается только для преобразования между двумя форматами .NET. Укажите для -conv шаблон *.resx или *.resources (маски * и ?), и каждый подходящий файл будет преобразован в противоположный формат за один вызов:

sircc64.exe -conv *.resx

Имена выходных файлов формируются автоматически из имён входных, поэтому явно заданное имя здесь игнорируется. Используйте -o <dir>, чтобы собрать результаты в одной папке, а не записывать каждый рядом с исходным.

Преобразование в собственный .res или .rc выполняется для одного файла за раз. Для этих целей маски не принимаются.

Коды завершения

0 — успех, 1 — ошибка, 2 — один или несколько файлов завершились ошибкой в пакетном запуске. Поэтому -conv можно безопасно использовать в сценарии сборки.

Преобразование .resx в .resources в приложении

Если нужно просто переключить файл между двумя форматами .NET и вы не хотите пользоваться командной строкой: откройте его в Resource Builder, выберите Файл > Сохранить как и укажите другой формат в списке типов файлов.

Преобразование .resx в .resources в приложении
Преобразование .resx в .resources в приложении

Собственные .res и .rc не предлагаются как цели для Сохранить как. Для них используйте -conv.

Как добавить ресурсы .NET в уже открытый собственный проект

Если ваша цель — не отдельный файл, а объединение ресурсов .NET с существующим собственным проектом .rc или .res, сделайте это в приложении. Открыв собственный проект, выберите Файл > Импорт или Файл > Объединить и укажите файл .resx/.resources. Записи преобразуются и добавляются на месте по тому же сопоставлению, что и в -conv.

Обратное направление

-conv не преобразует собственные .rc, .res, .exe или .dll в .resx/.resources. Он отклоняет такую попытку с понятным сообщением.

Перейти от собственных ресурсов к .NET всё же можно внутри приложения. Откройте проект .resx/.resources и используйте Файл > Импорт или Файл > Объединить для собственного источника. Ресурсы иконок, курсоров и растровых изображений становятся настоящими записями .NET, наборы STRINGTABLE распаковываются в отдельные записи .NET String с именами по #define каждой строки, а остальные типы (RCDATA, информация о версии, манифест) передаются как непрозрачные массивы байтов. Ресурсы меню, диалогов и акселераторов не имеют эквивалента в .NET и пропускаются, а их количество сообщается в конце.

Что нужно знать

  • Имена собственных ресурсов пишутся в верхнем регистре и не зависят от регистра. Две записи .NET, имена которых различаются только регистром, при преобразовании будут конфликтовать. Если это относится к вашему файлу, сначала переименуйте одну из них.
  • Файл .rc больше двоичного. Поскольку байты каждой записи встроены в виде шестнадцатеричного текста, размер скрипта примерно втрое больше размера аналогичного .res.
  • Файл .rc самодостаточен. Никаких сопутствующих файлов, поэтому его можно безопасно фиксировать отдельно или передавать другой команде.

Попробуйте

Resource Builder — коммерческий продукт с бесплатным 30-дневным пробным периодом. Скачайте его на странице загрузки и выполните sircc64.exe -conv yourfile.resx yourfile.rc, чтобы увидеть создаваемый скрипт.