0

我有一个独立的 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 是未知的,它无法加载类型并引发异常。我怎样才能仍然保持隔离,并能够执行上述操作?

4

1 回答 1

1

我有一个类似的问题并通过以下方式解决了它:

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

于 2015-07-02T07:01:38.977 回答