2015-04-01 66 views
0

我有一个独立的WPF加载项。插件获取对暴露事件的类型的引用。由于插件在特定的应用程序域中被隔离,因此主机对插件的DLL或存储在其中的类型一无所知。在单独的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是未知的,它无法加载类型并抛出异常。我怎样才能保持隔离状态,并且能够像上面描述的那样进行操作?

+0

“失败”如何?实际抛出什么异常?你的加载项类型是否也是'MarshalByRef'?或可序列化?这个问题与WPF真的有什么关系吗?或者你可以在简单的控制台程序中重现相同的问题吗?请注意,如果没有[可靠,_minimal_,_complete_代码示例](http://stackoverflow.com/help/mcve)可靠地显示问题,则可能很难找到愿意花时间想出一个解决方案(假设存在)。 – 2015-04-02 04:12:13

+0

这似乎是一个奇怪的设计。你的'AddInHandler'不是一个处理程序 - 它是事件的生产者。似乎这可能是倒退。 – Enigmativity 2015-07-02 07:19:16

回答

0

我也有类似的问题,并解决它以下列方式:

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