17

Я хотел бы знать, если я могу поймать необработанные исключения, брошенные другой процесс, который я начал использовать Process.Start (...)поймать другой процесс необработанного исключение

Я знаю, что я могу поймать standered ошибки, используя этот link, но я хочу поймать ошибку, которая обычно попадает в отладчик Just In Time среды the.net, окно со следующими словами: «Необработанное исключение произошло в вашем приложении. Если вы продолжите, приложение проигнорирует эту ошибку и попытается продолжить. Если вы нажмете «Выход», приложение будет немедленно отключено ... » Затем следует сообщение об исключении и кнопка« Продолжить »и« Выход ».

Заранее спасибо.

+0

Я хочу узнать, могу ли я как-то коснуться кода другого выполняющегося процесса и добавить обработчик события в событие AppDomain.UnhandledException. Спасибо за помощь, ребята –

+0

Я думаю, что ур прав, никаких проблем не имеет точного индивидуального решения. это стоит того, чтобы выстрелить. –

ответ

6

Если вы звоните в исполняемой сборки .Net вы можете загрузить его и (на свой страх и риск: D) называют к основному методу класса программы в try_catch заявление:

Assembly assembly = Assembly.LoadFrom("ErroneusApp.exe"); 
Type[] types= assembly.GetTypes(); 
foreach (Type t in types) 
{ 
MethodInfo method = t.GetMethod("Main", 
    BindingFlags.Static | BindingFlags.NonPublic); 
if (method != null) 
{ 
    try 
    { 
     method.Invoke(null, null); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    break; 
} 
} 

Но быть осознавая угрозы безопасности, которые вы вводите, делая это.

+0

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

+0

Я должен спросить здесь, есть ли способ узнать, является ли exe исполняемой сборкой .net? Что делать, если приложение находится под .net 2.0, а другое - 3,5, это будет иметь значение? –

+0

Я попытался вызвать конструктор с помощью метода GetConstructor(). Но это не работает для меня. Не могли бы вы поделиться идеей или примером кода для этого? –

2

Нет. Если контролируемое приложение использует коды стандартного кода и возврата, вы можете получить уведомление о возникновении ошибки или исключения, но вы не можете каким-либо образом уловить его.

+0

+1 за то, что вы не пытаетесь ничего хеджировать. –

11

Вы можете попробовать что-то подобное, чтобы избежать вопроса отладчика появится, вы не получите исключение, но только код выхода:

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      ProcessStartInfo info = 
       new ProcessStartInfo("ErroneusApp.exe"); 
      info.ErrorDialog = false; 
      info.RedirectStandardError = true; 
      info.RedirectStandardOutput = true; 
      info.CreateNoWindow = true; 
      info.UseShellExecute = false; 

      System.Diagnostics.Process p = 
       System.Diagnostics.Process.Start(info); 
      p.EnableRaisingEvents = true; 
      p.Exited += p_Exited; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     Console.ReadLine(); 
    } 


    static void p_Exited(object sender, EventArgs e) 
    { 
     Process p = sender as Process; 
     if (p != null) 
     { 
      Console.WriteLine("Exited with code:{0} ", p.ExitCode); 
     } 
     else 
      Console.WriteLine("exited"); 
    } 

} 

В this question они предоставляют еще один обходной путь для этого, но некоторые изменения значения реестра.

+0

Я не думаю, что это то, что я ищу 10x за помощь в любом случае –

1

Вместо того, чтобы все пробираться вокруг сборки, чтобы попытаться найти главный метод, как в ответе jmservera, вы можете просто выполнить сборку в новом домене. См. this msdn article

0

При решении предыдущей задачи вызова цели, наконец, я получаю метод ниже.

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

Assembly assembly = Assembly.LoadFrom(file); 
        Directory.SetCurrentDirectory(Path.GetDirectoryName(file)); 
        Type[] types = assembly.GetTypes(); 
        foreach (Type t in types) 
        { 
         MethodInfo method = t.GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic); 
         if (method != null) 
         { 
          try 
          { 
           method.Invoke(null, null); 
          } 

Directory.SetCurrentDirectory (Path.GetDirectoryName (файл)); // путем ссылки на текущее исключение вызова целевого каталога будет разрешено.

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