Архитектура приложения прокси / загрузчика .NET - PullRequest
1 голос
/ 29 октября 2010

Я хочу запустить приложение WPF во втором домене приложений из класса «загрузчик». Если приложение WPF отключится, я хочу, чтобы оно запустило событие обратно в класс загрузчика, а класс загрузчика выгрузит () 2-й домен приложения и покажет экран входа в систему. Если пользователь снова войдет в систему, тот же процесс повторится.

У меня это работает до степени:

  1. Класс Loader создает второй AppDomain и класс B в этом домене через CreateInstanceAndUnwrap.

  2. Класс Loader создает MarshalByRefObject, который имеет событие Timeout, и передает его в B.StartUp (MBRO), который передает MBRO в конструктор WPF App (). Класс загрузчика добавляет обработчик в MBRO.Timeout.

  3. Время ожидания приложения WPF вызывает MBRO.Timeout, который обрабатывается классом Loader. В обработчике событий класс Loader закрывает B WPF App и показывает окно входа в систему.

Проблема в том, что я не могу выгрузить 2-й домен приложения на шаге 3. Когда я это делаю, он также отключает хост-домен приложения (без исключений или чего-то еще, все отключается).

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

Это правильно? Работает ли это так на доменах?

Итак, кто-нибудь может предложить способ, с помощью которого вы можете запустить 2-й домен приложений, получить событие от 2-го домена приложений и выгрузить () 2-й домен приложений при получении этого события? Я думаю, что мне нужен кто-то, чтобы отделить получение события от Акта выгрузки домена приложения.

1 Ответ

0 голосов
/ 29 октября 2010

Да, это правильно.Проблема состоит в том, что трассировка стека проходит от основного домена через второй домен и обратно к основному домену.

У вас есть несколько вариантов здесь.

  1. Вы звонитев домен приложения.Если бы вы могли сделать так, чтобы вызываемый вами метод возвращался с определенным кодом состояния (например, Success или Timeout), у вас больше не возникает проблема со стеком;

  2. Вы вызываете домен приложения из второго потока:

    1. Из первого потока создайте новый поток, который создает домен приложения и запускает приложение;

    2. По-прежнему в первом потоке создайте AutoResetEvent и выполните для него WaitOne();

    3. Когда событие выполняется из домена приложения, оно не будет выполняться впервая нить.Я не уверен, будет ли событие выполняться во втором событии, и если нет, то создание вторичного потока не потребуется.Из входящего потока установите где-нибудь флаг 'Timeout' и выполните Set() для события;

    4. Основной поток просыпается и знает, что делать в зависимости отстатус флага.

...