поймать другой процесс необработанное исключение - PullRequest
18 голосов
/ 17 февраля 2010

Я хочу знать, смогу ли я перехватить необработанные исключения, выданные другим процессом, который я начал использовать Process.Start (...)

Я знаю, что могу поймать зашифрованную ошибку, используя эту ссылку , но я хочу отловить ошибку, которая обычно обнаруживается отладчиком Just In Time среды ..net, в окне следующие слова: «В вашем приложении произошло необработанное исключение. Если вы продолжите, приложение проигнорирует эту ошибку и попытается продолжить. Если вы нажмете« Выйти », приложение будет немедленно закрыто ....» За этим следует сообщение об исключении и кнопки «Продолжить» и «Выход».

Ответы [ 5 ]

12 голосов
/ 17 февраля 2010

Вы можете попробовать что-то подобное, чтобы избежать появления вопроса отладчика, вы не получите исключение, а только код выхода:

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

}

В этом вопросе они предоставили другой обходной путь для этого, но изменили некоторые значения реестра.

8 голосов
/ 18 февраля 2010

Если вы вызываете исполняемую сборку .Net, вы можете загрузить ее и (на свой страх и риск: D) вызвать метод Main класса Program в оператор 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;
 }
}

Но помните об угрозах безопасности, которые вы вносите, делая это.

2 голосов
/ 17 февраля 2010

Нет. Если в контролируемом приложении используются стандартные ошибки и коды возврата, вас могут уведомить о появлении ошибки или исключения, но вы не сможете перехватить их каким-либо образом.

1 голос
/ 29 октября 2011

Вместо того, чтобы пытаться найти метод Main, как в ответе jmservera, вы можете просто выполнить сборку в новом домене. См. эту статью MSDN

0 голосов
/ 19 августа 2016

При решении предыдущей проблемы с целевым вызовом, в конце концов, я получаю метод, описанный ниже.

Некоторые из ваших приложений могут иметь зависимости в текущем каталоге, что приводит к исключению, когда оно выполняется в другом каталоге, поскольку зависимости не совпадают.

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 (файл)); // при обращении к текущему каталогу целевое исключение вызова будет разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...