我有一个应用程序可以创建一个像这样的新应用程序域:
private static AppDomain domain = null;
private static void LoadAndLaunchAppDomain(string assemblyFile, string typeName)
{
AppDomainSetup setup = new AppDomainSetup()
{
ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
ShadowCopyFiles = "true"
};
domain = AppDomain.CreateDomain("ClientKernel", null, setup);
domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
ClientKernelLauncher launcher = (ClientKernelLauncher)domain.CreateInstanceFromAndUnwrap(assemblyFile, typeName);
launcher.Launch();
}
static void domain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// handler
}
在某些时候抛出异常并且流量进入HANDLER内部。我真正想要的是在发生这种情况时重新创建域。我注意到,处理程序实际上是在“ClientKernel”应用程序域上运行,而不是创建它的原始域。
如何与原始域进行通信并告诉它再次调用LoadAndLaunchAppDomain()
方法?
答案 0 :(得分:3)
使用AppDomain.DoCallBack()
在另一个AppDomain
上调用方法。
我不确定在调用AppDomain
时抛出未处理的异常是否可行。但是,你可以试一试。
答案 1 :(得分:1)
这样的事情会起作用吗?
AppDomain hostDomain = AppDomain.CurrentDomain;
domain = AppDomain.CreateDomain("ClientKernel", null, setup);
domain.UnhandledException += (s, e) => {
hostDomain.DoCallBack(() => { SomeStaticClass.LoadAndLaunchAppDomain("someAssembly", "someClassName"); }
}
我不知道托管代码的类的名称是什么,因此您需要将SomeStaticClass更改为正确的类名。