2009-06-12 11 views
9

Diamo asume il bit folowing di codice, che consente di chiamare una classe in un dominio di applicazione diverso e gestire praticamente qualsiasi eccezione:Gestione delle eccezioni critiche in diversi AppDomain

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace MyAppDomain 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     AppDomain myDomain = null; 
     try 
     { 
     myDomain = AppDomain.CreateDomain("Remote Domain"); 
     myDomain.UnhandledException += new UnhandledExceptionEventHandler(myDomain_UnhandledException); 
     Worker remoteWorker = (Worker)myDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Worker).FullName); 
     remoteWorker.VeryBadMethod(); 
     } 
     catch(Exception ex) 
     { 
     myDomain_UnhandledException(myDomain, new UnhandledExceptionEventArgs(ex, false)); 
     } 
     finally 
     { 
     if (myDomain != null) 
      AppDomain.Unload(myDomain); 
     } 

     Console.ReadLine(); 
    } 

    static void myDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     Exception ex = e.ExceptionObject as Exception; 
     if (ex != null) 
     Console.WriteLine(ex.Message); 
     else 
     Console.WriteLine("A unknown exception was thrown"); 
    } 
    } 

    public class Worker : MarshalByRefObject 
    { 
    public Worker() 
    { 

    } 

    public string DomainName 
    { 
     get 
     { 
     return AppDomain.CurrentDomain.FriendlyName; 
     } 
    } 

    public void VeryBadMethod() 
    { 
     // Autch! 
     throw new InvalidOperationException(); 
    } 

    } 
} 

Ora il problema è, allmost qualsiasi l'eccezione può essere gestita, non tutte le eccezioni. Ad esempio, StackOverflowException arresta comunque il processo. Esiste un modo per rilevare eccezioni critiche in diverse appdomain e gestirle scaricando AppDomain, ma consentire comunque ad altri AppDomain di continuare?

risposta

2

Purtroppo non è possibile rilevare una StackOverflowException.

See: http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

... partire con .NET Framework versione 2.0 , un oggetto StackOverflowException non può essere catturato da un try-catch blocco e il processo corrispondente è terminata di default . ...

Aggiornamento:

Dopo ulteriori indagini nei miei vecchi problemi Ho trovato questa vecchia discussione: http://www.c-sharpcorner.com/Forums/ShowMessages.aspx?ThreadID=36073