Подписка на события в изолированной надстройке WPF

У меня есть изолированная надстройка WPF. Надстройка получает ссылку на тип, предоставляющий событие. Поскольку надстройка изолирована в определенном домене приложения, хост ничего не знает о DLL надстройки или хранящихся там типах.

Договор:

    [AddInContract]
    public interface IAddInContract: IContract
    {
        void Initialize(IAddInHandler handler);
    }

handler — это тип, который предоставляет событие и является производным от MarshalByRef, так что прокси-сервер передается надстройке:

    public class AddInHandler : MarshalByRefObject, IAddInHandler 
    {
       public event SelectionChangedEventHandler SelectionChanged;
    }

и в надстройке делаем что-то вроде:

        public override void Initialize(IAddInHandler handler)
        {
            handler.SelectionChanged += handler_SelectionChanged;
        }

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


person Mefhisto1    schedule 01.04.2015    source источник
comment
Не получается как? Какое исключение на самом деле выбрасывается? Тип вашей надстройки тоже MarshalByRef? Или сериализуемый? Действительно ли этот вопрос имеет какое-либо отношение к WPF? Или вы могли бы воспроизвести ту же проблему в простой консольной программе? Обратите внимание, что без хорошего, минимального, полного примера кода, надежно демонстрирующего проблема, вам может быть трудно найти кого-то, кто захочет найти время, чтобы придумать решение (при условии, что оно существует).   -  person Peter Duniho    schedule 02.04.2015
comment
Кажется, это странный дизайн. Ваш AddInHandler не обработчик, а источник событий. Кажется, это может быть задним числом.   -  person Enigmativity    schedule 02.07.2015


Ответы (1)


у меня была аналогичная проблема, и я решил ее следующим образом:

Для контракта надстройки я не использовал шаблон событий C# с использованием делегатов. Я использовал шаблон регистрации событий «Java-Like», это означает, что я создал интерфейс с одним методом (интерфейс должен реализовать IContract), затем я создал в контракте два метода с AddEventHandler и RemoveEventHandler. Оба требуют экземпляр ранее созданного интерфейса. В адаптерах вы создаете адаптер между вашим делегатом и этой реализацией интерфейса.

person Tobias Lorentz    schedule 02.07.2015