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.