从内部卸载AppDomain

时间:2011-06-14 11:46:02

标签: .net appdomain

我们已经构建了一个WPF可执行文件。

我想在子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 Domain创建一个新线程并将主线程连接到它。我在下载更新时在内部调用了AppDomain.Unload()

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

思想?

1 个答案:

答案 0 :(得分:1)

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