Как определить, что неуправляемое приложение прервано

StackOverflow https://stackoverflow.com/questions/1048703

Вопрос

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

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

Есть ли способ С# обнаружить, что в приложении С++ произошла ошибка, и просто перезапустить его?

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

    Использование (Process p = new Process ()) {

     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)
     {
     }
    }
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top