我有一个隔离的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是未知的,它无法加载类型并抛出异常。我怎样才能保持隔离,并能够做出如上所述的事情?
答案 0 :(得分:0)
我遇到了类似的问题并通过以下方式解决了这个问题:
对于加载项合同,我没有使用代理使用C#事件模式。我使用了“Java-Like”事件注册模式,这意味着我创建了一个带有一个Method的接口(接口需要实现IContract),然后我在Contract中使用AddEventHandler和RemoveEventHandler创建了两个方法。两者都需要先前创建的接口的实例。 在适配器中,您可以在委托和接口实现之间创建适配器。