我有一个C#app,它通过Process.Start()调用非托管C ++应用程序
在某些机器上,如果这个C ++应用程序中止,我将留下Just-In-Time错误对话框显示
是否有一种方法可以让C#检测到C ++应用程序出错并重新启动它
(我没有源代码,因此无法修改C ++应用程序)
答案 0 :(得分:1)
显示JIT调试器对话框,因为C ++应用程序以某种方式崩溃。当对话框打开时,该过程仍然存在(但是暂停),这意味着在JIT对话被解除或附加的调试器结束该过程之前,Process类不会认为它已“退出”。
你可以在遇到问题的机器上禁用JIT调试(我认为禁用机器调试管理器服务可能会禁用JIT调试),允许应用程序崩溃并死掉(因此,报告为“退出”),或(我不知道你将如何做到这一点)看看你是否可以让你的主机C#app附加自己作为C ++应用程序的调试器并从C ++接收崩溃的通知应用程序,终止它,然后对它已经结束的信息采取行动。
答案 1 :(得分:0)
如果C ++是基于控制台的,你可以检查两件事,
exitcode,通常0表示正常关闭,否则是问题(但我认为这取决于用于开发此应用程序的惯例)
检查标准错误是否为空,所以一切正常
使用(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)
{
}
}