Мой ответ состоит из двух частей. Первая часть показывает, как найти проблему, когда ваша программа падает, до того, как она действительно запустится. Вторая часть объясняет исправление, которое решает сбой.
Часть 1. Почему произошел сбой моей программы?
Странно то, что моя программа работала на других компьютерах и других версиях Windows. Программа не работала на компьютерах с Windows 7 (и, по-видимому, 64-разрядных). Таким образом, мой первый инстинкт был посмотреть на различия между старыми версиями Windows и более новыми версиями. Однако, похоже, что многое изменилось, так что это безнадежное дело.
Моя вторая попытка найти проблему использовала WinDbg, отладчик, который позволяет увидеть, где произошла ошибка вашей программы. Проблема с этой попыткой заключалась в том, что трассировка стека не указывала на информацию, которая помогла мне понять проблему. Сначала это на самом деле указывало мне в неправильном направлении. Я заставил меня посмотреть на подписание моей сборки. Это, однако, не было частью моей проблемы.
Третья попытка заставила меня взглянуть, какое исключение было выброшено изнутри программы. Я сделал это, добавив немного кода регистрации и обработчик непредвиденных исключений.
В методе Main я добавил этот код:
AppDomain.CurrentDomain.UnhandledException
+= new UnhandledExceptionEventHandler (CurrentDomain_UnhandledException);
TraceListener log = new TextWriterTraceListener ("abacus.log");
Trace.Listeners.Add (log);
Trace.Listeners.Add (new ConsoleTraceListener ());
Обработчик исключения вызывается всякий раз, когда исключение не перехватывается. Операторы Trace инициализируют различные обработчики журналов. Добавьте /d:TRACE
, чтобы включить диагностику. В классе я добавил этот метод, который печатает информацию, находящуюся внутри исключения.
static void CurrentDomain_UnhandledException (object sender, UnhandledExceptionEventArgs e) {
try {
Exception ex = (Exception)e.ExceptionObject;
Trace.Write ("Whoops! Please contact the developers with the following information:\n\n" + ex.Message + ex.StackTrace + ex.InnerException.Message + ex.InnerException.StackTrace);
Trace.Flush ();
} finally {
Application.Quit();
}
}
Запуск этой расширенной программы привел к сообщению журнала с информацией об исключении. С этим сообщением в журнале я обнаружил сообщение , которое объясняет, почему моя программа падает. Я пытаюсь загрузить 64-битную версию сборок, которые не доступны как 64-битные, только 32-битные. И это проблема.
Часть 2. Как остановить сбой моей программы?
В моей первой попытке я изменил настройку в MonoDevelop, которая заставляет его генерировать 32-битный код. Это не решило мою проблему.
Во второй попытке я загрузил программу под названием corflags.exe
, которая включена в Windows SDK. Эта программа позволяет мне изменить флаг, который заставляет Windows запускать эту программу как 32-битную программу. Это решает мою проблему.
corflags.exe /32BIT+ program