2015-04-01 4 views
0

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

контракта:

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

обработчик представляет собой тип, который предоставляет событие, и происходит от MarshalByRef, так что прокси-сервер передается надстройке:

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

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

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

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

+0

«Сбой» как? Какое исключение фактически выбрано? Является ли ваш тип надстройки также «MarshalByRef»? Или сериализуем? Этот вопрос действительно имеет отношение к WPF? Или вы могли бы воспроизвести ту же проблему в простой консольной программе? Обратите внимание, что без [хорошего, _minimal_, _complete_ кода примера] (http://stackoverflow.com/help/mcve), который надежно демонстрирует проблему, вам может быть трудно найти кого-то, желающего найти время, чтобы придумать решение (если оно существует). –

+0

Это кажется странным дизайном. Ваш 'AddInHandler' не является обработчиком - он является производителем событий. Похоже, это может быть наоборот. – Enigmativity

ответ

0

я имел подобную проблему и решить ее следующим образом:

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