我想知道是否可以捕获使用Process.Start(...)启动的另一个进程抛出的未处理异常。
我知道可以使用link捕获标准错误,但我想要捕获通常由.net环境的Just In Time调试器捕获的错误,窗口显示以下内容: “您的应用程序发生了未处理的异常。如果选择继续,则应用程序将忽略此错误并尝试继续运行。如果选择退出,则应用程序将立即关闭....” 随后是异常消息和“继续”和“退出”按钮。
我想知道是否可以捕获使用Process.Start(...)启动的另一个进程抛出的未处理异常。
我知道可以使用link捕获标准错误,但我想要捕获通常由.net环境的Just In Time调试器捕获的错误,窗口显示以下内容: “您的应用程序发生了未处理的异常。如果选择继续,则应用程序将忽略此错误并尝试继续运行。如果选择退出,则应用程序将立即关闭....” 随后是异常消息和“继续”和“退出”按钮。
您可以尝试类似于这样的方法,以避免调试器问题的出现。这样做可以让您获得退出代码,而不是异常提示。
class Program
{
static void Main(string[] args)
{
try
{
ProcessStartInfo info =
new ProcessStartInfo("ErroneusApp.exe");
info.ErrorDialog = false;
info.RedirectStandardError = true;
info.RedirectStandardOutput = true;
info.CreateNoWindow = true;
info.UseShellExecute = false;
System.Diagnostics.Process p =
System.Diagnostics.Process.Start(info);
p.EnableRaisingEvents = true;
p.Exited += p_Exited;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
static void p_Exited(object sender, EventArgs e)
{
Process p = sender as Process;
if (p != null)
{
Console.WriteLine("Exited with code:{0} ", p.ExitCode);
}
else
Console.WriteLine("exited");
}
}
在这个问题中,他们提供了另一种解决方法,但需要更改一些注册表值。
如果您要调用一个.Net可执行程序集,您可以加载它,并(自行承担风险 :D)在try_catch语句中调用Program类的Main方法:
Assembly assembly = Assembly.LoadFrom("ErroneusApp.exe");
Type[] types= assembly.GetTypes();
foreach (Type t in types)
{
MethodInfo method = t.GetMethod("Main",
BindingFlags.Static | BindingFlags.NonPublic);
if (method != null)
{
try
{
method.Invoke(null, null);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
break;
}
}
Assembly assembly = Assembly.LoadFrom(file);
Directory.SetCurrentDirectory(Path.GetDirectoryName(file));
Type[] types = assembly.GetTypes();
foreach (Type t in types)
{
MethodInfo method = t.GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic);
if (method != null)
{
try
{
method.Invoke(null, null);
}