2010-12-23 70 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更改爲正確的類名。

相關問題