Как определить, что неуправляемое приложение прервано - PullRequest
1 голос
/ 26 июня 2009

У меня есть приложение C #, которое вызывает неуправляемое приложение C ++ через Process.Start ()

На некоторых машинах, если это приложение C ++ прерывается, у меня появляется диалоговое окно ошибки Just-In-Time, показывающее

Есть ли способ из C # обнаружить ошибку в приложении C ++ и просто перезапустить ее

(у меня нет исходного кода и, следовательно, я не могу изменить приложение C ++)

Ответы [ 2 ]

1 голос
/ 26 июня 2009

Отображается диалоговое окно отладчика JIT, потому что приложение C ++ каким-то образом зависло. Пока диалоговое окно открыто, процесс все еще присутствует (но приостановлен), что означает, что класс Process не будет считать его "завершенным" до тех пор, пока диалог JIT не будет закрыт или присоединенный отладчик не завершит процесс.

Вы можете отключить отладку JIT на компьютерах, на которых возникла проблема (я думаю, , что отключение службы диспетчера отладки машины может отключить отладку JIT), позволяя приложению аварийно завершить работу и умереть (и, следовательно, сообщить как "выход"), или (и я не знаю, как бы вы поступили с этим), посмотрите, можете ли вы заставить свое приложение C # хоста присоединяться в качестве отладчика для приложения C ++ и получать уведомления о сбое из приложения C ++ прекратить его действие, а затем действовать в соответствии с информацией, которую он закончил.

0 голосов
/ 26 июня 2009

Если C ++ основан на консоли, вы можете проверить две вещи,

  1. Код выхода, обычно 0 означает, что закрыто обычно, иначе это проблема (но я думаю, что это зависит от соглашения, используемого для разработки этих приложений)

  2. Проверьте стандартную ошибку, если она пуста, так что все в порядке

    использование (Процесс p = новый Процесс ()) {

     p.StartInfo.UseShellExecute = false;
     p.StartInfo.RedirectStandardError = true;
     p.StartInfo.FileName = "any.exe";
     p.Start();
     string error = p.StandardError.ReadToEnd();
     p.WaitForExit()
     if(error.Length == 0 && p.ExitCode == 0)
     {
     }
    }
    
...