Lassen Sie uns das Folowing Stück Code asume, mit dem Sie eine Klasse in einer anderen AppDomain und Griff fast jede Ausnahme aufrufen können:Umgang mit kritischen Ausnahmen in verschiedenen AppDomains
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();
}
}
}
Das Problem ist jetzt, allmostjede Ausnahme kann behandelt werden, nicht jede Ausnahme. Eine StackOverflowException zum Beispiel stürzt den Prozess immer noch ab. Gibt es eine Möglichkeit, kritische Ausnahmen in verschiedenen Anwendungsdomänen zu erkennen und diese zu behandeln, indem Sie die Anwendungsdomäne entladen, aber weiterhin andere Anwendungsdomänen zulassen?