Уловить еще одно необработанное исключение процесса
Я хотел бы знать, могу ли я перехватить необработанные исключения, выданные другим процессом, который я начал использовать Process.Start(...)
Я знаю, что по этой ссылке я могу поймать зашифрованную ошибку, но я хочу поймать ошибку, которая обычно обнаруживается отладчиком Just In Time среды .net, в окне со следующими словами: "Произошло необработанное исключение в вашем приложении. Если вы продолжите, приложение проигнорирует эту ошибку и попытается продолжить. Если вы нажмете "Выйти", приложение будет немедленно закрыто.... ", за которым следует сообщение об исключении и" Продолжить "и Кнопка "Выйти".
Ответы
Ответ 1
Если вы звоните в исполняемую сборку .Net, вы можете загрузить ее и (на свой страх и риск: D) вызвать основной метод класса 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
Вы можете попробовать что-то подобное, чтобы избежать появления вопроса об отладчике, вы не получите исключение, а только код выхода:
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");
}
}
В этом вопросе они предоставили для этого другой обходной путь, но изменили некоторые значения реестра.
Ответ 3
Нет. Если контролируемое приложение использует коды стандарта Error и возврата, вы можете получить уведомление о возникновении ошибки или исключения, но вы никак не можете его заманить.
Ответ 4
Вместо того, чтобы все пробираться вокруг сборки, чтобы попытаться найти главный метод, как в ответе jmservera, вы можете просто выполнить сборку в новом домене. См. эту статью msdn
Ответ 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(файл));//путем ссылки на текущее исключение вызова целевого каталога будет разрешено.