2011-01-31 3 views
0

Мое относительно простое приложение Window, похоже, сбой, как только оно попадает в метод InitializeComponent в конструкторе формы. Теперь форма, очевидно, является частичным классом, а InitializeComponent - это вызов метода в другой части частичного класса. Проблема в том, что генерируется другой частичный класс. Как я могу отладить его и выяснить, какая строка приводит к сбою моего приложения. Приложение аварийно завершает работу с диалоговым окном отчета об ошибках с очень редкими деталями ошибки. Я не могу отладить приложение через среду IDE, потому что приложение только сбой на машине развертывания, и загрузка vs2008 на этом компьютере не может быть и речи. Пожалуйста помоги.Аварии приложений WindowsForm на InitializeComponent

+0

что делает исключение? –

+0

Я не получаю исключения или, по крайней мере, я не могу его увидеть. Я получаю один из этих диалоговых окон «Пожалуйста, сообщите Microsoft об этой проблеме». Сам отчет об ошибке содержит в основном шум и шестнадцатеричный дамп. Модули, упомянутые здесь, являются mscorlib и, кроме того, содержат только один огромный объем данных в отчете об ошибках используемых модулей и их номеров версий и т. Д. Вот почему я так расстроен. В этом нет ничего хорошего. – n4rzul

+0

Одна сторона примечание. Я завернул все в конструкторе формы в try catch так: try {do stuff} catch (Exception e) {MessageBox.Show (e.Message)}, но исключение никогда не выбрасывается. Просто MS Сообщить об этом блоке bla bla. – n4rzul

ответ

1

Без дальнейших подробностей будет сложно дать вам какие-либо конкретные предложения.

Вы можете добавить обработчик события в application ThreadException, чтобы поймать любые необработанные исключения. В обработчике событий я мог бы регистрировать исключение, stacktrace и любые другие соответствующие данные, которые у вас могут быть. Если вы не используете какую-либо структуру протоколирования, вы всегда можете использовать то, что доступно в пространстве имен System.Diagnostics (и необходимые дополнения к вашему app.config), чтобы добавить некоторую простую обработку вывода журнала.

Другая мысль, которую я имею, это использование библиотек пользовательских интерфейсов, отличных от MS? Если да, включены ли они в приложение/установщик. Предполагая, что ваше приложение использует некоторые, и они не включены, это может быть причиной его сбоя в вызове InitializeComponent.

Обновление:
Основываясь на ваших комментариях, я обновил свой ответ. Вы можете добавить код в метод InitializeComponent, просто имейте в виду, что это сгенерированный код, поэтому его редактирование создает определенный риск. Тупой вопрос, но вы проверили, чтобы убедиться, что конструктор даже вызван? Тот факт, что он рушится, как вы описываете, обычно является индикатором того, что что-то фундаментальное для приложения отсутствует/неправильно настроено на целевой машине. Вы также можете проверить журнал событий Windows на этом компьютере, чтобы узнать, было ли там что-то полезное для вас.

+0

Lemme дать приложение ThreadException идея идти. – n4rzul

+0

Нет, не вызывает событие.Жаль, что я не могу просто изменить метод InitializeComponent частичного класса с несколькими MessageBox.Shows – n4rzul

+0

. По моему мнению, крах, который не вызывает ThreadException, обычно является одной из двух вещей: это либо переполнение стека, либо исключение в финализаторе. –

1

ThreadException здесь работает, исключение поднимается слишком рано. Напишите обработчик событий для AppDomain.CurrentDomain.UnhandledException, подпишитесь в свой метод Main() (Program.cs) перед вызовом конструктора Application.Run() и/или формы. В этом случае обработчик регистрирует или отображает значение e.ExceptionObject.ToString(). Сообщение об исключении и трассировка стека, которые вы получите, почти всегда достаточно хороши, чтобы диагностировать и исправлять причину исключения.

[STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
     Application.Run(new Form1()); 
    } 

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { 
     MessageBox.Show(e.ExceptionObject.ToString()); 
     Environment.Exit(1); 
    } 
+0

Хорошо, давайте это. Я даже ударил все мои элементы управления в форме, чтобы избавиться от кода в разделе InitializeComponent. Пока не повезло, но позвольте мне попробовать ваше предложение быстро. – n4rzul

+0

Nope. Нет радости. Тот же результат, что и мой вопрос orignal ... – n4rzul

+0

Для этого нет разумного режима отказа, за исключением неправильной подписки на события. Сообщение обновлено с образцом кода. –

Смежные вопросы