Что стоит за тихой неудачей загрузки ресурса на 64-битной машине с .NET 4.0? - PullRequest
2 голосов
/ 08 марта 2012

Пользователь моей программы сообщил о невозможности запустить приложение.Я еще не закончил устранение неполадок, но я просто сбит с толку.

Ведение журнала все еще работает, поэтому я использовал операторы ведения журнала и смог сузить сбой до одной строки в пользовательском элементе управления InitializeComponent:

this.HorizontBox.Image = ((System.Drawing.Image) (resources.GetObject ("HorizontalBox.Image")));

Вот соответствующие подсказки из егоend:

  • 64-битная Windows 7
  • Правильно .NET Framework (профиль клиента 4.0)
  • Визуальные элементы не отображаются и диалоговые окна ошибок отсутствуют.Это автоматическое отключение при запуске.
  • Ведение журнала работает, но не было зарегистрировано ошибок.
  • Он удалил и переустановил среду профиля клиента .NET 4.0.
  • ОнУ меня нет Visual Studio или других инструментов разработки, которые мешают с вещами.

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

  • Я нацеливаюсь на x86 явно.
  • Ведение журнала, в котором не удалось зарегистрировать любое исключение, настроено на перехват и запись любых необработанных исключений иисключения прерывания потока.
  • Что бы ни убивало приложение, оно также препятствует окончательному «завершению» сообщения журнала в базовой точке входа программы.
  • Я читал определенные форматы файлов значков (.ICO)не работает в Windows XP.Надуманная теория, так как это Windows 7. Это единственный и единственный случай файлов ICO в проекте, поэтому я с подозрением отнесся к PNG.Нет разницы.С тех пор я понимаю, что изображение не работает просто потому, что это первое изображение, загруженное из ресурса.
  • Я читал, что событие Form_Load может проглотить исключения (и только при отладке).Кроме того, InitializeComponent () находится в конструкторе, поэтому теория была шаткой.Тем не менее, я обернул вызов InitializeComponent () в try / catch, но никогда не вызывался catch и связанные с ним журналы.
  • Я видел сообщения о проблемах компиляции ресурсов между x86 и x64, но ничего не относящегося кпроблемы во время выполнения.(См. этот пост )
  • Я предположил, что должно быть что-то не так, уникальное в программе, показывающей проблемы, поэтому я сделал тестовое приложение WindowsFormsApplication1, содержащее не более одного изображения, встроенного в связанный ресурсфайл.Это также не может загрузить таким же образом.Это тестовое приложение также предназначалось для x86.
  • Оно отлично работает на других машинах x86 и x64!

Что может происходить на его машине?Почему обработка исключений меня подводит?Эта проблема сумасшедшая!

Редактировать: Подробнее, и я все еще сбит с толку!

  • С тех пор я отправил тестовое приложение (aодна форма с одним изображением), построенная как x86, x64 и «Any Cpu».Оба приложения x64 и Any Cpu работают.

1 Ответ

0 голосов
/ 17 марта 2012

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

Установил ли он в папку по умолчанию или сделал индивидуальную установку?

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

Можете ли вы воссоздать аналогичную сборку (версия ОС) с установленной VS для выполнения пошагового кода в отладчике - трассировка стека и выходной буфер могут помочь идентифицировать - как и дизассемблирование - и могут настроить его на остановку во всех исключениях?

К сожалению, необработанные исключения не всегда могут быть перехвачены в C # (особенно после версии 2.0), поэтому отладчик WinDBG может оказаться единственным вариантом в конце (юк!).

Могу я сначала кое-что предложить ... Просто мысль:

Перед ошибкой строки в качестве теста выведите что-то вроде этого:

var obj = resources.GetObject("HorizontalBox.Image");
        Console.WriteLine("Obj = " + (obj is Bitmap));

Поскольку у меня возникает ощущение, что сбой происходит при попытке перенаправить ресурс в тип растрового изображения и получить исключение из памяти (возможно, что-то повреждено из-за шага изображения / формата пикселей и т. Д. Или, возможно, что-то на компьютере-виновнике делает файл изображения выглядит как не файл изображения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...