2016-11-24 16 views
1

Мы используем блок try-catch в Main(), чтобы поймать все Исключения приложения и записать их в файл lgo. Все отлично работает в конфигурации Release в VS2012. Исключения выбрасываются и сохраняются в файле.C# Исключение не выбрасывается после установки

После создания установщика с использованием WIX и установки приложения исключение напрямую вызывается (и отображается как диалог), но не улавливается блоком try-catch в Main() и поэтому не сохраняется в файле больше , Как я могу поймать Исключение в Main()?

Это код в Program.cs:

[STAThread] 
    static void Main() 
    { 
     try 
     { 

      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainForm()); 
     } 
     catch (Exception ex) 
     { 
      ExceptionLog.SaveExceptionCloseApp(Program.RuntimeGUID, System.Reflection.MethodBase.GetCurrentMethod().Name + "()", ex); 
     } 
    } 
+0

Что именно вы имеете в виду при сохранении файла? Что именно вы делаете? Предоставьте нам некоторый код, который работает во время отладки, но не после установки. –

+0

Добавлен код программы.cs – user2952145

+0

Может ли быть исключение, потому что, как только вы установили приложение через WiX-сгенерированный MSI, папка установки не содержит все необходимые бинарные файлы? Тогда выполнение завершится с ошибкой * до * Main, поэтому не будет поймано вашим блоком try/catch. Я также предлагаю использовать инструмент FusLogVw, чтобы проверить, доступны ли все необходимые сборки. –

ответ

1

Это работает для нас:
@Hans Passant: Благодарим Вас за решение.

[STAThread] 
    static void Main() 
    {   
     Application.ThreadException += Application_ThreadException; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 

    static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) 
    { 
     ExceptionLog.SaveExceptionCloseApp(Program.RuntimeGUID, System.Reflection.MethodBase.GetCurrentMethod().Name + "()", e.Exception); 
    }