Я должен использовать функциональность, которая находится в другом домене приложения.Результат должен отображаться в пользовательском элементе управления.
У меня что-то подобное:
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".