catch another process unhandled exception
Solution 1
If you are calling to a .Net executable assembly you can load it and (at your own risk :D ) call to the Main method of the Program class into a try_catch statement:
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;
}
}
But be aware of the security risks you are introducing doing that.
Solution 2
You can try something like that to avoid the debugger question to appear, you won't get the exception but only the exit code:
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");
}
}
In this question they provided another workaround for that, but changing some registry values.
Solution 3
No. If the controlled app utilizes standardError and return codes you may be notified of the occurance of an error or exception but you cannot trap it in any way.
Solution 4
Instead of doing the whole sneaking around the assembly to try to find the Main method like in jmservera's answer, you can simply execute the assembly in a new domain. See this msdn article
Ahmad Hajou
Software developer in the Market Research industry. Focus on C#, and Javascript.
Updated on July 09, 2022Comments
-
Ahmad Hajou almost 2 years
I wish to know if i can catch the unhandled exceptions thrown by another process which I started using the Process.Start(...)
I know i can catch the standered error using this link , but what I want is to catch the error that are usually caught by the Just In Time debugger of the.net environment, the window with the following words: "An unhandled exception has occurred in your application . If you Continue, the application will ignore this error and attempt to continue . If you click Quit, the application will be shut down immediately ...." Which is then followed by the exception message and a "Continue" and "Quit" button.
-
Ahmad Hajou about 14 yearsI don't think this is what I am looking for 10x for the help anyway
-
Ahmad Hajou about 14 yearsI think this is the exact answer I'm currently looking for Thank you very sir. P.S. in my implementation, i think im going to add the newly loaded assembly to a new AppDomain.
-
Ahmad Hajou about 14 yearsI gotta ask here, is there a way to find out if the exe is a .net executable assembly? what if the application is under .net 2.0 while the other is 3.5, will that matter?
-
Kathir Subramaniam almost 8 yearsI tried to invoke the constructor using GetConstructor() method. But it is not working for me. Could you please share an idea or sample code to achieve this?
-
Kiquenet about 5 yearsHow Call for a BAT script in UNC folder ?