1

我有一个 C# 应用程序,它通过 Process.Start() 调用非托管 C++ 应用程序

在某些机器上,如果这个 C++ 应用程序中止,我会看到即时错误对话框显示

有没有办法从 C# 中检测到 C++ 应用程序出错并重新启动它

(我没有源代码,因此无法修改 C++ 应用程序)

4

2 回答 2

1

显示 JIT 调试器对话框是因为 C++ 应用程序以某种方式崩溃。在对话框打开时,进程仍然存在(但已暂停),这意味着 Process 类不会认为它已“退出”,直到 JIT 对话被解除或附加的调试器结束进程。

您可以在遇到问题的机器上禁用 JIT 调试(我认为禁用 Machine Debug Manager 服务可能会禁用 JIT 调试),允许应用程序崩溃和死机(因此,报告为“退出”),或者(和我不知道你会怎么做)看看你是否可以让你的主机 C# 应用程序将自己附加为 C++ 应用程序的调试器并从 C++ 应用程序接收崩溃通知,终止它,然后采取行动它已经结束的信息。

于 2009-06-26T12:18:17.100 回答
0

如果 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)
     {
     }
    }
    
于 2009-06-26T12:15:23.283 回答