【问题标题】:catch another process unhandled exception捕获另一个进程未处理的异常
【发布时间】:2010-02-17 08:20:03
【问题描述】:

我想知道我是否可以捕获由我开始使用 Process.Start(...) 的另一个进程引发的未处理异常

我知道我可以使用 link 捕获标准错误,但我想要的是捕获通常由 .net 环境的即时调试器捕获的错误,带有以下文字的窗口: “您的应用程序中发生了未处理的异常。如果您继续,应用程序将忽略此错误并尝试继续。如果您单击退出,应用程序将立即关闭......” 然后是异常消息和“继续”和“退出”按钮。

【问题讨论】:

  • 我想知道我是否可以以某种方式利用其他正在运行的进程的代码并将事件处理程序添加到 AppDomain.UnhandledException 事件。谢谢大家的帮助
  • 我认为你是对的,没有问题有确切的定制解决方案。不过值得一试。

标签: c# error-handling unhandled-exception launching-application


【解决方案1】:

您可以尝试类似的方法来避免出现调试器问题,您不会得到异常,而只会得到退出代码:

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");
    }

}

this question 中,他们为此提供了另一种解决方法,但更改了一些注册表值。

【讨论】:

  • 我不认为这是我正在寻找的 10 倍的帮助
  • 如何在 UNC 文件夹中调用 BAT 脚本?
【解决方案2】:

如果您正在调用 .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;
 }
}

但请注意这样做会带来的安全风险。

【讨论】:

  • 我认为这是我目前正在寻找的确切答案,非常感谢先生。附言在我的实现中,我想我会将新加载的程序集添加到新的 AppDomain。
  • 我想在这里问一下,有没有办法确定 exe 是否是 .net 可执行程序集?如果应用程序在 .net 2.0 下,而另一个在 3.5 下怎么办?
  • 我尝试使用 GetConstructor() 方法调用构造函数。但这对我不起作用。您能否分享一个想法或示例代码来实现这一目标?
【解决方案3】:

没有。如果受控应用程序使用标准错误和返回代码,您可能会收到发生错误或异常的通知,但您不能以任何方式捕获它。

【讨论】:

    【解决方案4】:

    您无需像 jmservera 的回答那样在程序集周围偷偷摸摸地尝试找到 Main 方法,您可以简单地在新域中执行程序集。见this msdn article

    【讨论】:

      【解决方案5】:

      在解决之前的目标调用问题时,最后我得到了下面的方法。

      您的某些应用程序将在当前目录中具有依赖项,这会导致在另一个目录中执行时出现异常,因为依赖项不匹配。

      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)); //通过引用当前目录目标调用异常将被解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 2017-11-25
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多