別のアプリケーションドメインにある機能を使用する必要があります。結果はユーザーコントロールに表示されます。
私はそのようなものを持っています:
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」から継承する必要があります。