Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Обнаружение ошибки


Автор: V0fka 17.5.2014, 11:50
Привет!

Пока отлаживал программу все работало. Пробный "боевой" запуск, компилирую с конфигурацией Release, переношу на нужный комп, запускаю - программа падает. Запускаю в отладчике - тоже ошибка:

user posted image

Импирическим путём я определил, что проблема в отсутствии каталога с ресурсами в папочке Release. В XAML-е формы используется привязка к директории ресурсов:

Код

<Image Source="Resources\exit.ico"/>


и именно в этой привязке была проблема. Скопировал папку - запустилось.

Вопрос: можно ли было как-то системно отследить эту и подобные ошибки? Т.е. чтобы куда-то посмотреть и узнать что конкретно системе не нравится? Хотя бы какая конкретно проблемная строка в XAML-е? А то по выдаваемому сообщению об ошибке как-то не очень понятно в чем проблема, тем более что сама форма в Visual Studio отрисовывается нормально и никаких ошибок нету.

Автор: V0fka 19.5.2014, 09:43
Картинка куда-то испарилась, повторяю:

user posted image

Автор: V0fka 22.5.2014, 08:46
Я ерунду спросил?

Автор: Экскалупатор 22.5.2014, 14:33
Цитата(V0fka @  22.5.2014,  07:46 Найти цитируемый пост)
Я ерунду спросил? 

почему же сразу "ерунду". Я, к примеру, не очень использую WPF, но мне кажется, что если система пишет что ошибка в парсере, то изначально надо проверить все ли есть что нужно для этого самого парсинга. ну и в деталях ошибки обычно больше инфы пишется. ну и если воспроизвести эту ситуацию и запустить под дебагом то должно ругаться более конкретно.

Автор: V0fka 22.5.2014, 21:19
Цитата(Экскалупатор @  22.5.2014,  14:33 Найти цитируемый пост)
если система пишет что ошибка в парсере, то изначально надо проверить все ли есть что нужно для этого самого парсинга

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

Цитата(Экскалупатор @  22.5.2014,  14:33 Найти цитируемый пост)
ну и в деталях ошибки обычно больше инфы пишется. ну и если воспроизвести эту ситуацию и запустить под дебагом то должно ругаться более конкретно.

Не исключено, что я как-то не так запускал. Завтра ещё попробую посмотреть и отпишу о результатах.

Спасибо за ответ! smile

Автор: V0fka 28.5.2014, 09:49
В общем, запустил опять, снова появилось такое окошко, но на этот раз в нём была кнопка "Сведения" (или что-то вроде того). Клацнул туда и там было написано, что система не может найти путь такой-то. Собственно, по такому сообщению все сразу становится ясно.


Экскалупатор, ещё раз спасибо за ответ!

Автор: Ilya81 30.5.2014, 14:30
В WPF есть ресурсы, не зачем помещать картинки в отдельные файлы. Указываются прямо в XAML в виде:
Код

<Image Source="pack://application:,,,/<имя сборки>;component/<подкаталоги>/<имя файла>.xaml"/>

Автор: V0fka 2.6.2014, 19:34
Ilya81, я где-то вычитал, мол "делается это так", поэтому так и сделал. На досуге обязательно попробую ваш вариант. Спасибо!

Автор: V0fka 3.6.2014, 09:32
Ilya81, картинку я добавляю в ресурсы. Но обоими способами (и тот, который я использовал и тот, который вы посоветовали) если удалить каталог с ресурсами - приложение не запускается. Возможно я как-то не правильно картинку в ресурсы закидываю? У меня в любом случае получается (я по разному пробовал в свойствах ресурса-картинки клацать), что при компиляции картинка помещается в отдельный каталог Resources, который если удалить - то программа падает. Как её "встроить"?

Автор: Ilya81 3.6.2014, 10:24
Что-то Вы неправильно делаете, если ошибка выплывает в runtime'е. Ресурсы статические, если их удалить, программа не будет build'иться. Во-первых, рекомендую проверить, что в свойствах файла картинки Build Action стоит Resource, по умолчанию на картинки может поставиться Content. И во-вторых, там же в свойствах надо выключить копирование в каталог сборки, картинки в этом случае будут внутри EXE или DLL, но не в отдельных файлах. И подчёркиваю - картинки, добавляемые в ресурсах не в каталоге bin, а в каталоге/подкаталогах самого проекта и видны в Solution Explorer по соседству с cs-файлами кода (если это не так, то это точно уж не WPF-ресурсы).

Автор: V0fka 3.6.2014, 12:39
Я добавлял картинку в Resources.resx и оно само копировалось в каталог Resoursec. Сейчас в проекте создал отдельный каталог Images, добавил туда картинку, сделал настройки которые вы выше посоветовали - вроде работает smile . Спасибо! Причем работает как с вариантом указания через Images\img.png так и pack://application:,,,/<имя сборки>;component/<подкаталоги>/<имя файла>.png.

Теперь возникло 2 новых вопроса smile :
1) Какая разница между Images\img.png и pack://application:,,,/<имя сборки>;component/<подкаталоги>/<имя файла>.png ?
2) Для чего тогда нужно использовать ресурсы, добавляемые через Resources.resx ?

Автор: Ilya81 3.6.2014, 14:06
Images\img.png - это т. с. относительный путь, разница примерно как между указанием пути как SomeDir\SomeFile.txt и D:\UpperDir\CurrentDir\SomeDir\SomeFile.txt. При указании относительного пути главное не перепутать, относительное расположение файла. 

Про Resources.resx и resgen, на котором он основан, - в принципе, кто как предпочитает, сам я чаще всего использую в нём строки для языковой локализации. Хотя WPF и для языковой локализации предлагает новое решение, оно гораздо менее удобно, к тому ж его (решение по языковой локализации) непонятно, как использовать, если строка сообщения формируется в коде. Но картинки, помещаемые в ресурсы таким способом, можно тоже получать в коде (например, если картинку нужно обрабатывать), хотя для этого может и Resources.resx подойдёт - это уже скорее дело вкуса.

Автор: V0fka 5.6.2014, 08:50
Может я туплю, но если файл встроен в сборку, то разве можно ошибиться/перепутать при любом варианте указания пути? Разве вариант Images\img.png при встроенном файле при каких-то обстоятельствах может этот файл не найти?

Про Resources.resx - спасибо! smile

Автор: Ilya81 5.6.2014, 11:24
Не найти при выполнении не может встроенный в сборку файл, может не build'иться, если путь указан неправильно. Впрочем, если указана другая сборка, то может не найти саму сборку.

Автор: V0fka 6.6.2014, 08:50
Что-то прояснилось, что-то не очень smile . Ilya81, спасибо за ответы!

Автор: V0fka 10.6.2014, 20:49
Я извиняюсь, но вопрос всеже мне покоя не даёт... smile 

Цитата(Ilya81 @  5.6.2014,  11:24 Найти цитируемый пост)
может не build'иться, если путь указан неправильно.

Так если путь указан в виде
Код

<Image Source="pack://application:,,,/<имя сборки>;component/<подкаталоги>/<имя файла>.xaml"/>

и по факту окажется, что <подкаталоги> или <имя файла> отсутствует - оно разве за'build'ится?

Автор: V0fka 26.6.2014, 08:56
Апну в надежде на то, что кто-то пробьёт мою броню. smile

Автор: DjonNIK 26.6.2014, 15:07
Не проще ли самому проверить на тестовом решении? ))

Автор: V0fka 26.6.2014, 20:29
Проверял. Но я разницы не пойму: если картинки по указанному пути в момент компиляции нету - то ошибка в обоих случаях. В этом сейчас и вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)