【发布时间】: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不是处理程序 - 它是事件的生产者。看起来这可能是倒退。