Приложение WindowsForm аварийно завершает работу при InitializeComponent - PullRequest
0 голосов
/ 31 января 2011

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

Ответы [ 2 ]

1 голос
/ 31 января 2011

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);
    }
1 голос
/ 31 января 2011

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

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

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

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

...