如何从使用System.Diagnostic.Process执行的exe中抑制对话框?

本文关键字:exe 对话框 执行 Process Diagnostic System | 更新日期: 2023-09-27 18:10:01

我正在使用System.Diagnostic.Process调用另一个。exe。我正在创建一个应用程序,其目的是在远程服务器上运行。这个。exe有时崩溃,有一个消息弹出停止整个进程->[应用程序名称]遇到了一个问题,并被迫关闭。我试图找到一种方法,使我的c#程序忽略这个弹出窗口,并继续执行。

如何从使用System.Diagnostic.Process执行的exe中抑制对话框?

是修复错误与。exe被称为不是一个选项?

在这种情况下,当你的进程不能正常工作时,你会看到一个弹出窗口,这是windows默认的,但如果你想知道进程是否成功运行,那么这段代码将为你工作

订阅流程。"退出"事件,然后检查"进程"。ExitCode:

 public void StartProcess()
{
 p.StartInfo.FileName = BasePath;
 p.StartInfo.Arguments = args;
 p.Start();
 p.Exited += new EventHandler(Process_Exited);
}
void Process_Exited(object sender, EventArgs e)
{
var p = sender as Process;
if (p.ExitCode != 0)
    MessageBox.Show(string.Format("Process failed: ExitCode = {0}", p.ExitCode));
}

IMHO运行这样一个有bug的exe的最干净的选项是启动它给你的进程调试特权(你可能必须通过p/Invoke显式调用CreateProcess与进程创建标志中的DEBUG_PROCESS标志),然后有一个线程处理WaitForDebugEvent提供的调试事件;每当你得到一个未处理的,最后的机会异常,你可以通知主线程,杀死子进程(从而避免默认的Windows异常处理程序),并在必要时重新启动它,在所有其他情况下,只是调用ContinueDebugEvent让程序正常运行。

请注意,WaitForDebugEvent提供的指向"事件结构"的指针在c#中可能很难处理。


edit :幸运的是,似乎有人为本机调试API做了一个很好的托管包装器,见这里。