订阅隔离的WPF加载项中的事件

时间:2015-04-01 06:40:04

标签: c# .net wpf remoting maf

我有一个隔离的WPF加载项。插件获取对公开事件的类型的引用。由于addin是在特定的appdomain中隔离的,因此主机对addin的DLL或存储在那里的类型一无所知。

合同:

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

handler是一种公开事件的类型,派生自MarshalByRef,以便将代理传递给addin:

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

在插件中我们做了类似的事情:

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

然而这失败了,因为它尝试(以某种方式)将addin的引用传递给宿主应用程序,并且因为对于主机,addin的dll是未知的,它无法加载类型并抛出异常。我怎样才能保持隔离,并能够做出如上所述的事情?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题并通过以下方式解决了这个问题:

对于加载项合同,我没有使用代理使用C#事件模式。我使用了“Java-Like”事件注册模式,这意味着我创建了一个带有一个Method的接口(接口需要实现IContract),然后我在Contract中使用AddEventHandler和RemoveEventHandler创建了两个方法。两者都需要先前创建的接口的实例。 在适配器中,您可以在委托和接口实现之间创建适配器。