【问题标题】:Subscring to events in an isolated WPF add-in订阅独立 WPF 加载项中的事件
【发布时间】:2015-04-01 06:40:03
【问题描述】:

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

【问题讨论】:

  • “失败”怎么办?实际抛出了什么异常?您的加载项类型也是MarshalByRef 吗?还是可序列化的?这个问题真的和WPF有关系吗?或者你能在一个简单的控制台程序中重现同样的问题吗?请注意,如果没有可靠地证明问题的a good, minimal, complete code example,您可能很难找到愿意花时间提出解决方案的人(假设存在解决方案)。
  • 这似乎是一个奇怪的设计。您的 AddInHandler 不是处理程序 - 它是事件的生产者。看起来这可能是倒退。

标签: c# .net wpf remoting maf


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多