发送消息到原始App域

时间:2010-12-23 10:47:55

标签: c# .net .net-2.0 appdomain

我有一个应用程序可以创建一个像这样的新应用程序域:

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()方法?

2 个答案:

答案 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更改为正确的类名。