Pergunta

Eu tenho um aplicativo C# que chama um aplicativo C ++ não gerenciado via process.start ()

Em algumas máquinas, se este aplicativo C ++ abortar, fico com a caixa de diálogo de erro just-in-time

Existe uma maneira de C# para detectar que o aplicativo C ++ errou e apenas reinicie -o

(Não tenho a fonte e, portanto, não consigo modificar o aplicativo C ++)

Foi útil?

Solução

A caixa de diálogo JIT Debugger está sendo exibida porque o aplicativo C ++ travou de alguma forma. Embora a caixa de diálogo esteja aberta, o processo ainda está presente (mas suspenso), o que significa que a classe de processo não considerará "sair" até que o diálogo JIT seja demitido ou um depurador anexado termine o processo.

Você pode desativar a depuração do JIT nas máquinas que enfrentam o problema (eu acho que desativar o serviço Machine Debug Manager pode desativar a depuração do JIT), permitindo que o aplicativo trava e morra (e, portanto, relate como "saiu"), ou (e eu não faço ideia de como você faria isso), veja se ver isso) veja se você Você pode fazer com que seu aplicativo C# host se conecte como um depurador para o aplicativo C ++ e receber notificação do acidente do aplicativo C ++, encerrar -o e depois agir com as informações que ele terminou.

Outras dicas

Se o C ++ for baseado no console, você pode verificar duas coisas,

  1. O código de saída, geralmente 0 significa fechado normalmente de outra forma é um problema (mas acho que isso depende da convenção usada para desenvolver esses aplicativos)

  2. Verifique o erro padrão se estiver vazio, então está tudo bem

    usando (processo 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)
     {
     }
    }
    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top