我想知道我是否可以捕获由我开始使用 Process.Start(...) 的另一个进程引发的未处理异常
我知道我可以使用此链接捕获标准错误,但我想要的是捕获通常由.net 环境的即时调试器捕获的错误,带有以下文字的窗口:“发生未处理的异常在您的应用程序中。如果您继续,应用程序将忽略此错误并尝试继续。如果您单击退出,应用程序将立即关闭....“然后是异常消息和“继续”和“退出”按钮。
我想知道我是否可以捕获由我开始使用 Process.Start(...) 的另一个进程引发的未处理异常
我知道我可以使用此链接捕获标准错误,但我想要的是捕获通常由.net 环境的即时调试器捕获的错误,带有以下文字的窗口:“发生未处理的异常在您的应用程序中。如果您继续,应用程序将忽略此错误并尝试继续。如果您单击退出,应用程序将立即关闭....“然后是异常消息和“继续”和“退出”按钮。
您可以尝试类似的方法来避免出现调试器问题,您不会得到异常,而只会得到退出代码:
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)将 Program 类的 Main 方法调用到 try_catch 语句中:
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;
}
}
但请注意您这样做所带来的安全风险。
否。如果受控应用程序使用标准错误和返回代码,您可能会收到发生错误或异常的通知,但您不能以任何方式捕获它。
无需像 jmservera 的答案那样在程序集周围进行整个偷偷摸摸以尝试找到 Main 方法,您可以简单地在新域中执行程序集。请参阅此 msdn 文章
在解决之前的目标调用问题时,最后我得到了下面的方法。
您的某些应用程序将在当前目录中具有依赖项,这会在另一个目录中执行时导致异常,因为依赖项不匹配。
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);
}
Directory.SetCurrentDirectory(Path.GetDirectoryName(file)); //通过引用当前目录目标调用异常将被解决。