2011-06-14 45 views
0

我们构建了一个WPF可执行文件。从内部卸载AppDomain

我想在子AppDomain中启动此可执行文件。

因此,将有一个主机AppDomain称为引导加载程序,它在单独的AppDomain中启动WPF应用程序。

WPF应用程序可以触发自身的更新,将新文件下载到临时文件夹中,然后需要发信号通知启动加载程序卸载它并更新WPF dll /文件。更新完成后,我们要重新启动WPF应用程序。

首先,我需要创建一个新的域:

AppDomain wpfDomain = AppDomain.CreateDomain("WPF Domain"); 
wpfDomain.ExecuteAssembly(WPFAPP_PATH + "WpfApp.exe"); 

现在棘手的问题是搞清楚如何信号引导装载程序来卸载WPF应用程序和更新。

我试着处理DomainUnload事件。它在WPF域中调用,所以我无法重新启动域。尝试调用重新创建WPF AppDomain并执行程序集时,我得到一个AppDomainUnloadedException

接下来我读取卸载放弃域中的所有线程,所以我尝试为WPF域创建一个新的线程并将主线程加入它。当更新被下载时,我在内部调用AppDomain.Unload()

难点在于“父”(引导加载程序)AppDomain不知道何时更新和重新启动子AppDomain,但我无法弄清楚孩子如何干净地通知父母然后卸载。

想法?

+0

经过更多的研究,看来我需要调查MAF(托管加载项框架)。 – 2011-06-14 13:42:56

回答

1

回答您的原始问题:我能想到的一个解决方案是创建一个ManualResetEvent,您可以在退出时触发子项。在加载程序中,您有主线程在等待这个事件的信号。当您完成更新可执行文件并重新创建子域时,可以重新设置该事件。

+0

这是个好主意。如果线程正确通信,父级可以控制子域的卸载。 – 2011-06-14 14:27:09

+0

工程就像一个魅力! – 2011-06-16 17:41:23

+0

因此,当我用控制台应用程序尝试它时,它工作得很好,但现在我正在使用一个WPF儿童应用程序,我得到一个CannotUnloadAppDomainException异常。有什么想法吗? – 2011-06-17 16:13:48