Как запустить приложение WPF в новом домене приложений и передать ему объект (службу) для взаимодействия? - PullRequest
0 голосов
/ 28 октября 2019

Я пишу плагин, который вызывается сторонним приложением. Стороннее приложение загружает мою сборку плагина в стандартный домен приложений и вызывает определенный метод в определенном классе, передавая ему «контекст» объекта, содержащий данные и методы (которые могут возвращать другие объекты с данными и методами).

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

Моя идея для решения заключается вМой плагин для создания нового AppDomain («subplugin») и загрузки его зависимостей там. Конечно, файл сборки плагина все равно будет заблокирован, но по крайней мере это будет один файл, в отличие от десятков файлов сборки, от которых он зависит. Я могу прикрепить номер версии к имени сборки плагина (и файлу), чтобы он отличался для каждого обновления.

Для того, чтобы передать данные в мой плагин, я не смог бы использовать третий -сторонний контекст приложения напрямую, потому что он не наследуется от MarshalByRefObject. Вместо этого я бы создал свой собственный контекст, который наследовал бы от MarshalByRefObject, и передал бы его как сервис. В каком-то смысле плагин станет «сервером» данных, а дополнительный плагин - «клиентом».

В качестве дополнительного усложнения плагин зависит от WPF, потому что он должен отображать пользовательский интерфейс. Обычно стороннее приложение уже загружает сборки WPF и любую необходимую инфраструктуру (например, диспетчер). Если я создам свой собственный AppDomain, мне придется настроить все это (я думаю?).

Предполагая, что моя идея верна, у меня возникает вопрос, как мне выполнить мой плагин как приложение WPFв новом AppDomain и передать объект, с которым он должен взаимодействовать?

Я вроде понимаю, как создать AppDomain и передать его (и получить) данные из другого AppDomain, но ни один из примеровЯ видел сделку с WPF. Самый близкий из них - https://eprystupa.wordpress.com/2008/07/31/running-multiple-wpf-applications-in-the-same-process-using-appdomains/,, но он просто выполняет приложение WPF, а не передает ему данные.

...