サード パーティ アプリケーションによって呼び出される DLL を作成しています。DLL は MTA スレッドから呼び出され、サード パーティ アプリケーションへの呼び出しは同じスレッドで行う必要があります。アプリケーションからアウト プロセス COM サーバーを呼び出す必要があり、COM サーバーに渡されたオブジェクトを使用して、この COM サーバーからサードパーティ アプリケーションにコールバックしたいと考えています。
例えば
// Called from third party MTA thread
// apiObject must always be called from same thread that called EntryPoint
void EntryPoint(API apiObject)
{
IMyComClass myComObj = createComObject();
myComObj.doStuff(apiObject);
}
Class MyComClass : IMyComClass
{
public void doStuff(API apiObject)
{
apiObject.doSomething();
}
}
ここで、スレッドを STA に変更できれば問題なく動作しますが、残念ながらこれは私の手に負えません。
COM サーバーから戻ってくる呼び出しを強制的に同じスレッドにする簡単な方法はありますか?
呼び出し元のアプリケーションは、Windows フォームや WPF アプリケーションではなく、ウィンドウのないサービスであることに注意してください。
私が考えることができる唯一のことは、COM サーバーへの呼び出しを行う新しいワーカー スレッドを作成し、独自のイベント キューを実装して、EntryPoint 内で API 呼び出しを待機するループを作成することです。次に、API 呼び出しへのデリゲートをワーカー スレッドからイベント キューに配置し、EntryPoint でキューを処理するときにすべてのデリゲートが正しいスレッドから呼び出されるようにします。
これは、非常に一般的なはずの非常に醜い複雑なソリューションのように思えます...単純な(r)ソリューションはありますか?