Подавить всплывающее окно исключений для приложения .NET, запущенного из автоматического кода - PullRequest
0 голосов
/ 21 июля 2010

У меня есть предварительно созданный EXE-файл консольного приложения .NET, который я запускаю из отдельного кода C # с использованием класса Process. Если приложение выдает необработанное исключение, всплывающее окно (то, которое говорит «возникла проблема и необходимо закрыть ...» и имеет кнопки «Отладка», «Отправить отчет об ошибке» и «Не отправлять») ,

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

Могу ли я в любом случае как-то подавить это всплывающее окно, не изменяя предварительно созданное приложение, или, по крайней мере, завершить процесс по истечении определенного времени. В идеале в любом решении я все еще хочу, чтобы исключение было зафиксировано в выводе консоли, чтобы я мог прочитать его из своего кода - это на самом деле работает нормально, пока я вручную нажимаю кнопку «Не отправлять», поэтому я просто хочу это произойти без взаимодействия с пользователем.

Спасибо ...

Ответы [ 4 ]

0 голосов
/ 17 сентября 2017

Попробуйте это:

string sProcessName = "firefox";

            if (driver.Capabilities.BrowserName == sProcessName)
            {
                // Special fix for firefox because of issue https://github.com/mozilla/geckodriver/issues/173
                // Kills all firefox processes

                Process[] oProccesses = null;
                bool bFound = true;

                while (bFound == true)
                {
                    bFound = false;
                    oProccesses = System.Diagnostics.Process.GetProcessesByName(sProcessName);

                    foreach (Process oCurrentProcess in oProccesses)
                    {
                        bFound = true;
                        //oCurrentProcess.Kill();


                        int waitTimeSecs = 2;

                        bool cleanExit = oCurrentProcess.WaitForExit(waitTimeSecs * 1000);
                        if (!oCurrentProcess.HasExited)
                        {
                            oCurrentProcess.CloseMainWindow();
                            System.Threading.Thread.Sleep(2000);
                        }

                        if (!oCurrentProcess.HasExited)
                        {
                            oCurrentProcess.Kill();
                            oCurrentProcess.WaitForExit();
                            // if an exception window has popped up, that needs to be killed too

                            foreach (var process in Process.GetProcessesByName("firefox"))
                            {
                                process.CloseMainWindow();
                                System.Threading.Thread.Sleep(2000);
                                if (!process.HasExited)
                                    process.Kill();
                            }
                        }


                    }
                }
                driver.Quit();
            }
0 голосов
/ 21 июля 2010

В вашей основной процедуре вы должны поместить обработчик необработанных исключений, который регистрирует ошибку, записывает что-то в консоль и / или закрывает приложение (при необходимости) и завершает работу.

Без изменения приложения я не вижу, как это сделать, за исключением, возможно, запуска вашего приложения как зависимого типа из другого приложения, которое создает экземпляр основного типа в этом приложении, а затем вызывает Main () из другое новое приложение. Несмотря на то, что приложение является исполняемым файлом, типы в нем могут использоваться (и их методы могут вызываться) из другого процесса, так как считается, что это сборка библиотеки dll. Необработанное исключение будет распространяться во внешнее приложение-оболочку, а затем делать, как предложено выше, в новом приложении.

... Или вы можете сделать это в «отдельном коде C #», где вы используете класс Process? Сделай это в основной рутине этого exe ....

0 голосов
/ 26 июля 2010

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

int waitTimeSecs = 120;    

bool cleanExit = process.WaitForExit(waitTimeSecs * 1000);
if (!process.HasExited)
{
    process.CloseMainWindow();
    System.Threading.Thread.Sleep(2000);
}

if (!process.HasExited)
{
    process.Kill();
    process.WaitForExit();
    // if an exception window has popped up, that needs to be killed too
    // DW20 is the Dr. Watson application error handling process
    foreach (var process in Process.GetProcessesByName("DW20"))
    {
        process.CloseMainWindow();
        System.Threading.Thread.Sleep(2000);
        if (!process.HasExited)
            process.Kill();
    }
}

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

0 голосов
/ 21 июля 2010

Вы можете написать хост для фреймворка и запустить ваше приложение на этом.Любое другое решение, которое я могу придумать, относится к Superuser или Serverfault.

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