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