17

Vorrei sapere se posso prendere le eccezioni non gestite generate da un altro processo, che ho iniziato ad usare il Process.Start (...)cattura un altro processo un'eccezione non gestita

so di poter rilevare l'errore di utilizzare questo standered link, ma quello che voglio è catturare l'errore che di solito viene catturato dal debugger Just in Time dell'ambiente.net, la finestra con le seguenti parole: "Si è verificata un'eccezione non gestita nell'applicazione. l'applicazione ignorerà questo errore e tenterà di continuare. Se si fa clic su Esci, l'applicazione verrà immediatamente chiusa .... " Che viene quindi seguito dal messaggio di eccezione e da un pulsante" Continua "e" Esci ".

Grazie in anticipo.

+0

Desidero scoprire Se riesco in qualche modo a digitare il codice dell'altro processo in esecuzione e aggiungere un gestore di eventi all'evento AppDomain.UnhandledException. Grazie per l'aiuto ragazzi –

+0

Penso che sia giusto, nessun problema ha la soluzione personalizzata esatta. vale comunque la pena sparare. –

risposta

6

Se si chiama a un assembly eseguibile .Net è possibile caricare e (a vostro rischio: D) chiamata al metodo principale della classe programma in una dichiarazione di 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; 
} 
} 

ma essere consapevole dei rischi per la sicurezza che stai introducendo facendo questo.

+0

Penso che questa sia la risposta esatta Attualmente sto cercando Grazie mille signore. P.S. nella mia implementazione, penso che sto per aggiungere l'assembly appena caricato a un nuovo AppDomain. –

+0

Devo chiedere qui, c'è un modo per scoprire se l'exe è un assembly eseguibile .net? e se l'applicazione è sotto .net 2.0 mentre l'altra è 3.5, importa? –

+0

Ho provato a richiamare il costruttore utilizzando il metodo GetConstructor(). Ma non sta funzionando per me. Potresti per favore condividere un'idea o un codice di esempio per raggiungere questo obiettivo? –

2

No. Se l'applicazione controllata utilizza i codici di errore e di ritorno standard, è possibile che venga notificato il verificarsi di un errore o di un'eccezione, ma non è possibile intercettarlo in alcun modo.

+0

+1 per non tentare di sottrarre nulla. –

11

Si può provare una cosa del genere al fine di evitare la questione debugger a comparire, non sarà possibile ottenere l'eccezione, ma solo il codice di uscita:

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 hanno fornito un'altra soluzione per questo, ma cambiando alcuni valori di registro.

+0

Non penso che questo sia quello che sto cercando 10x per l'aiuto comunque –

1

Invece di fare tutto il furtivamente intorno all'assemblaggio per cercare di trovare il metodo Main come nella risposta di jmservera, è sufficiente eseguire l'assembly in un nuovo dominio. Vedi this msdn article

0

Nel risolvere il precedente problema di chiamata di destinazione, alla fine ho finito con il metodo di seguito.

Alcune delle vostre applicazioni avrebbero dipendenze nella directory corrente, il che porta all'eccezione ogni volta che viene eseguita in un'altra directory poiché le dipendenze non corrispondono.

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 (file)); // facendo riferimento alla directory corrente, l'eccezione di invocazione del target verrebbe risolta.

Problemi correlati