2010-12-23 73 views
2

我有一个创建这样一个新的应用程序域的应用程序:信息发送到原来的应用程序域

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 
} 

在某些时候会抛出异常和流量达到处理程序中。我真正想要的是在发生这种情况时重新创建域。我注意到,处理程序实际上是在“ClientKernel”应用程序域中运行的,而不是创建它的原始域。

如何能够回传到原始域并告诉它再次调用LoadAndLaunchAppDomain()方法?

+0

如果您从两种方法中删除`static`,您的代码是否仍然有效?如果是这样,它是否执行正确的`AppDomain`(因为原来的对象是在原来的`AppDomain`中创建的)?请注意,如果回调函数允许使用实例方法,那么您可能仍然需要使用对象`Serializable` /`MarshalByRefObject`来使其工作。 – 2010-12-23 10:58:58

+0

我无法删除它。我正在使用静态类。 – 2010-12-23 13:09:21

回答

3

使用AppDomain.DoCallBack()可以调用另一个AppDomain上的方法。

我不确定一旦在调用AppDomain时抛出未处理的异常,它是否会工作。但是,你可以试试看。

+0

好的,但我如何获得对异常处理程序内的主(原始)应用程序域的引用? – 2010-12-23 12:25:10

1

会这样的工作?

AppDomain hostDomain = AppDomain.CurrentDomain; 
domain = AppDomain.CreateDomain("ClientKernel", null, setup); 
domain.UnhandledException += (s, e) => { 
    hostDomain.DoCallBack(() => { SomeStaticClass.LoadAndLaunchAppDomain("someAssembly", "someClassName"); } 
} 

我不知道你是什么类的托管代码的名字,所以你需要SomeStaticClass更改为正确的类名。

相关问题