我必须使用另一个应用程序域中的功能。结果应显示在用户控件中。
我有类似的东西:
var instance = domain.CreateInstanceFromAndUnwrap(...);
instance.Foo(myWpfUserControl as ICallback);
Foo(ICallback itf) {
itf.SetData("...");
}
WpfUserControl.SetData(string data)
{
if (!Dispatcher.CheckAccess())
Dispatcher.Invoke(...)
...
}
我不得不将 [Serializable] 属性放到 WpfUserControll 类上并实现序列化构造函数以及 ISerializable 接口,但现在我收到异常:
The calling thread must be STA because many UI components require this
从 UserControl() 构造函数中引发
我该怎么做才能避免这种情况?先感谢您 !
===============================
解决方案
正如@Al 所注意到的,当涉及到跨应用程序域调用时,我的用户控件必须被序列化。现在我通过代理,它实现了 ICallback 接口。代理被标记为 Serializable 属性。
代理实现应该完全不了解用户控件,因为应该尝试再次反序列化用户控件实例。当我尝试通过界面从用户控件中抽象代理时,它没有帮助。当我尝试将接口传递给代理(由用户控件实现)时 - 发生了同样的异常。
最后,我用队列/信号量解耦了代理和用户控制。队列由一个工作线程监控,该线程将调用委托给用户控制
ps 这个队列应该继承自“MarshalByObjectRef”。