Visual Studio: как сохранить ресурс изображения как встроенный ресурс?

По умолчанию, когда вы добавляете изображение (значок, растровое изображение и т. Д.) В качестве ресурса в проект, для параметра " Действие построения" для этого изображения задано значение " Нет". Это сделано потому, что изображение волшебным образом хранится в файле.resources.

Я хочу, чтобы ресурс был сохранен как встроенный ресурс (мои причины не имеют значения, но давайте просто притворимся, что я могу видеть их внутри рефлектора RedGate).

Поэтому я изменил действие " Построение каждого изображения" на " Встроенный ресурс", и ресурс появился внутри "Отражателя" Лутца - именно так, как я хочу.

К сожалению, Microsoft говорит специально не делать этого:

Обратите внимание, что когда редактор ресурсов добавляет изображение, он устанавливает для параметра Build Action значение None, поскольку файл.resx ссылается на файл изображения. Во время сборки изображение помещается в файл.resources, созданный из файла.resx. Затем к изображению можно легко получить доступ через строго типизированный класс, автоматически сгенерированный для файла.resx.

Поэтому не следует менять этот параметр на " Встроенный ресурс", поскольку при этом изображение будет дважды включено в сборку.

Итак, как правильно включить изображение в качестве встроенного ресурса?

4 ответа

Решение

Примечание. Этот ответ не является рекомендуемым способом обработки ресурсов изображения. Это просто решает конкретную проблему, как описано в вопросе (т.е. включать изображение в качестве встроенного ресурса).

Не добавляйте изображение в качестве ресурса. Я бы предпочел сделать следующее:

  • Создайте изображение / значок и сохраните его в файл
  • Выберите Project -> Add Existing Item и добавьте файл
  • Установите для действия "Построение" значение "Встроенный ресурс"

Вы можете получить доступ к этому ресурсу, используя

Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceUri)

Таким образом, изображение волшебным образом не добавляется в файл ресурсов проектов, и у вас будет только одна копия изображения, хранящаяся в ресурсах сборки.

В представлении проекта откройте поддерево свойств; дважды щелкните элемент Resources.resx.

(Если у вас его нет, щелкните правой кнопкой мыши элемент "Свойства" и выберите "Открыть", затем перейдите на вкладку "Ресурсы" слева и нажмите ссылку в середине страницы, чтобы создать файл ресурсов по умолчанию.)

щелкните первый выпадающий список вверху страницы resources.resx. Это, вероятно, говорит что-то бесполезное, например "Строки", и выберите "Изображения". Также вы можете нажать Ctrl + 2. Это изменяет представление ресурсов изображения. Теперь нажмите "Добавить ресурс" и выберите "существующий файл". Выберите файл изображения и нажмите "Открыть". Переименуйте ресурс, если хотите.

Нажмите значок Сохранить.

Теперь вы можете программно получить доступ к встроенному ресурсу:

[namespace].Properties.Resources.[yourResourceName]

В VS 2005:

  • Щелкните правой кнопкой мыши по вашему проекту и выберите добавить новый элемент.
  • Добавьте файл ресурса. Звоните myImages.resx
    Поместите этот файл в корневую папку проекта.
  • Щелкните правой кнопкой мыши на myImages.resx и выберите View Designer.
  • Выберите Добавить ресурс, Добавить существующий файл.
  • Найдите изображение, например, stop.bmp
    Это изображение не обязательно должно быть включено в проект на данном этапе. Файл ресурса автоматически сделает это.

Для ссылки на изображение в коде используйте что-то вроде:

btnStop.Image = myImages.Stop;

Это зависит от того, как вы хотите использовать изображение.

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

Если вы просто хотите встроить ресурс в сборку и не беспокоитесь о локализации (используйте Assembly.GetManifestResourceStream) затем просто добавив изображение и установив действие сборки Embedded Resource Это хорошо.

Документация предупреждает вас о том, что не нужно устанавливать действие для сборки Embedded Resource потому что ресурс уже скомпилирован в сборку компилятором ресурса через файл.resx.

Другие вопросы по тегам