поймайте другое необработанное исключение процесса

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

Я знаю, что могу зафиксировать standered ошибку с помощью этой ссылки, но что я хочу, должен зафиксировать ошибку, которые обычно пойманы Как раз вовремя отладчик среды the.net, окна со следующими словами: "Необработанное исключение произошло в Вашем приложении. Если Вы Продолжите, то приложение проигнорирует эту ошибку и попытается продолжиться. При нажатии на Quit приложение будет сразу закрыто...." Который затем сопровождается сообщением об исключении и кнопкой "Continue" и "Quit".

18
задан Kiquenet 6 February 2019 в 14:12
поделиться

3 ответа

Если вы вызываете исполняемую сборку .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;
 }
}

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

8
ответ дан 30 November 2019 в 08:43
поделиться

нет такого ключевого слова.

-121--1698008-

Нет, C++ не имеет такого ключевого слова.

-121--1698004-

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

2
ответ дан 30 November 2019 в 08:43
поделиться

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

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

}

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

12
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: