Решён
Как поместить изображение в проект при компиляции, чтобы оно работало на другом ПК?

Виктор Смирнов C#/.NET
5.6k
5

Пишу десктопное приложение на C#. Есть папка с иконками и фоновыми картинками. При запуске из студии все грузится нормально, но если скинуть экзешник на другой комп - картинки не отображаются, приложение крашится с ошибкой file not found. Как поместить изображение в проект при компиляции чтобы на выходе был один единственный exe файл со всеми ресурсами внутри? Не хочу таскать папку с картинками вместе с прогой.

UPDATE: Разобрался с Embedded Resource, спасибо ответившим. Код для извлечения картинки тоже пригодился.
Решение
85
Эксперт • 1 ответ

Использовать Embedded Resource - правильный путь.

После того как поменяешь Build Action, доставать картинку в коде нужно будет через поток. Просто по пути к файлу она уже не откроется.

Assembly myAssembly = Assembly.GetExecutingAssembly();
Stream myStream = myAssembly.GetManifestResourceStream("ТвойПроект.Папка.картинка.png");
Bitmap bmp = new Bitmap(myStream);

Главное правильно указать неймспейс. Имя ресурса формируется как DefaultNamespace.FolderName.FileName.Extension.

0
Эксперт • 1 ответ

Запихни все ресурсы в базу SQLite, храни там как BLOB. Экзешник останется легким, а база будет лежать рядом. Плюс сможешь динамически обновлять картинки без перекомпиляции всего проекта. Это нормальная архитектура для серьезных приложений.

Аватар Саша Бренд

Человеку нужен один exe файл, зачем вы советуете базу данных таскать? Читайте вопрос внимательнее.

56
Эксперт • 2 ответа

Раньше для такого использовали .resx файлы ресурсов. Создаешь файл ресурсов, перетаскиваешь туда картинку и студия сама генерирует класс для доступа к ней типа Properties.Resources.MyImage. Никакой возни со стримами.

40
Эксперт • 1 ответ

В WPF можно просто поставить Build Action на Resource (а не Embedded Resource). Тогда картинка запакуется в BAML и можно будет обращаться к ней через обычный Pack URI в xaml разметке: Source="pack://application:,,,/Images/image.png"

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.