我有一个独立的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是未知的,所以它无法加载该类型并抛出异常。我怎样才能仍然保持隔离,并能够做上面描述的事情呢?
发布于 2015-07-02 15:01:39
我遇到了类似的问题,并通过以下方式解决了它:
对于外接程序合约,我没有使用使用委托的C#事件模式。我使用了“类Java”的事件注册模式,这意味着我用一个方法创建了一个接口(接口需要实现IContract),然后我在契约中用AddEventHandler和RemoveEventHandler创建了两个方法。两者都需要先前创建的接口的一个实例。在适配器中,您可以在委托和该接口实现之间创建适配器。
https://stackoverflow.com/questions/29384383
复制相似问题