Выгрузить AppDomain изнутри - PullRequest
0 голосов
/ 14 июня 2011

Мы создали исполняемый файл WPF.

Я хочу запустить этот исполняемый файл в дочернем домене приложения.

Таким образом, будет хост-домен AppDomain, называемый загрузчиком, который запускает приложение WPF в отдельном домене приложений.

Приложение WPF может инициировать для себя обновление, которое загружает новые файлы во временную папку, а затем должно подать сигнал загрузчику, чтобы выгрузить его и обновить dll / файлы WPF. После завершения обновления мы хотим перезапустить приложение WPF.

Итак, сначала мне нужно создать новый домен:

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

Теперь самое сложное - выяснить, как подать сигнал загрузчику о необходимости разгрузить приложение WPF и обновить его.

Я пытался обработать событие DomainUnload. Он вызывается в домене WPF, поэтому я не могу перезапустить домен. Я получаю AppDomainUnloadedException при попытке вызвать воссоздание домена приложения WPF и выполнить сборку.

Далее я прочитал, что выгрузка прерывает все потоки в домене, поэтому я попытался создать новый поток для домена WPF и присоединить к нему основной поток. Я позвонил AppDomain.Unload() внутренне, когда обновления были загружены.

Сложность в том, что «родительский» (начальный загрузчик) AppDomain не знает, когда обновить и перезапустить дочерний AppDomain, но я не могу понять, как ребенок может аккуратно уведомить родителя и затем загрузить его. 1021 *

Мысли

1 Ответ

1 голос
/ 14 июня 2011

Чтобы ответить на ваш первоначальный вопрос: я мог бы придумать одно решение - создать ManualResetEvent, который вы можете вызвать у ребенка при выходе.В загрузчике у вас есть главный поток, ожидающий сигнала об этом событии.Когда вы закончите обновлять исполняемые файлы и воссоздаете дочерний домен, вы можете снова сбросить событие.

...