Visual Studio: как сохранить ресурс изображения в качестве встроенного ресурса?
По умолчанию, когда вы добавляете изображение (значок, растровое изображение и т.д.) в качестве ресурса для своего проекта, для изображения Действие сборки установлено значение Нет. Это делается потому, что изображение волшебным образом хранится в файле .resources.
Я хочу, чтобы ресурс был сохранен как встроенный ресурс (мои причины неактуальны, но позвольте просто притвориться, что я вижу их внутри Рефлектор RedGate).
Таким образом, я изменил каждое изображение Настроить действие на Встроенный ресурс, и тогда ресурс появится внутри Lutz Reflector - точно так, как я хочу.
К сожалению, Microsoft специально не говорит об этом:
Обратите внимание, что когда редактор ресурсов добавляет изображение, он устанавливает Действие сборки. Нет, потому что файл .resx ссылается на файл изображения. При сборке времени, изображение втягивается в .resources файл, созданный из .resx файл. Тогда изображение может легко доступ через строго типизированный класс, автоматически созданный для .resx файл.
Поэтому вы не должны меняться этот параметр - Встроенный ресурс, потому что это будет включать дважды в сборке.
Итак, каков правильный способ, чтобы включить изображение в качестве встроенного ресурса?
Ответы
Ответ 1
Примечание. Этот ответ не является рекомендуемым способом обработки ресурсов изображения. Он просто решает конкретную проблему, как описано в вопросе (например, включить изображение в качестве встроенного ресурса).
Не добавляйте изображение в качестве ресурса. Я предпочел бы сделать следующее:
- Создайте образ/значок и сохраните его в файле
- Выберите "Проект" → "Добавить существующий элемент" и добавьте файл
- Установить действие сборки для встроенного ресурса
Затем вы можете получить доступ к этому ресурсу с помощью
Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceUri)
Таким образом, изображение не добавляется волшебным образом к файлу ресурсов проектов, и у вас будет только одна копия изображения, хранящегося в ресурсах сборки.
Ответ 2
В представлении проекта откройте поддерево свойств; дважды щелкните элемент Resource.resx.
(Если у вас его нет, щелкните правой кнопкой мыши элемент "Свойства" и выберите "Открыть", затем щелкните вкладку "Ресурсы" слева и нажмите ссылку в середине страницы, чтобы создать файл ресурсов по умолчанию).
щелкните первый дроппер в верхней части страницы resources.resx. Вероятно, это говорит что-то бесполезное, как "Строки", и выберите "Изображения". В качестве альтернативы вы можете нажать Ctrl + 2. Это изменится на представление ресурсов ресурсов. Теперь нажмите Add the droplist и выберите "существующий файл". Выберите файл изображения и нажмите "Открыть". Переименуйте ресурс, если хотите.
Нажмите значок "Сохранить".
Теперь вы можете обращаться к встроенному ресурсу программно:
[namespace].Properties.Resources.[yourResourceName]
Ответ 3
В VS 2005:
- Щелкните правой кнопкой мыши свой проект и
выберите новый элемент.
- Добавить файл ресурсов. Вызов
myImages.resx
Поместите этот файл в корневую папку проекта.
- Щелкните правой кнопкой мыши myImages.resx
и выберите View Designer
- Выберите Добавить ресурс, Добавить существующий
файл.
- Просмотр изображения, например. stop.bmp
Этот образ не должен быть включен в проект на данном этапе. Файл ресурсов автоматически сделает это.
Чтобы ссылаться на изображение в коде, используйте что-то вроде:
btnStop.Image = myImages.Stop;
Ответ 4
Это зависит от того, как вы хотите использовать изображение.
Если вы хотите локализовать и получить доступ к определенным изображениям для определенной культуры, то использовать ResourceManager
- это хороший способ, потому что он предоставляет некоторые интересные функции для спутниковых сборок, поиска, резервных копий и т.д.
Если вы просто хотите встроить ресурс в сборку и не беспокоитесь о локализации (используя Assembly.GetManifestResourceStream
), то просто добавить изображение и установить действие сборки на Embedded Resource
отлично.
Документация предупреждает вас о том, чтобы не устанавливать действие сборки на Embedded Resource
, потому что ресурс уже скомпилирован в сборку компилятором ресурсов через файл .resx.