0

を作成するときThread、開始する前にその COM アパートメントの状態を明示的に設定するオプションがあります。例えば:

// using System.Threading;
var thread = new Thread(…);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

しかし、 を作成AppDomainしてそれにコードをロードすると、スレッドの作成を明示的に制御できないように見えるため、 を呼び出す方法がありませんSetApartmentState

// using System;
var pluginAppDomain = AppDomain.Create("PluginAppDomain");
pluginAppDomain.ExecuteAssembly(@"Plugin.dll");

内部で作成されたメイン/エントリ スレッドがAppDomain特定の COM アパートメント状態を使用するように指定する方法はありますか?

のメイン エントリ メソッドをor属性Plugin.dllでマークできることはわかっています。がCOM アパートメントの状態を明示的に宣言または設定しておらず、変更できないと仮定しましょう。[STAThread][MTAThread]Plugin.dllPlugin.dll

4

1 に答える 1

0

上記の Hans Passant のコメントを回答として再投稿します。これは、この質問のほとんどに本質的に回答するためです。

「いいえ、[アプリ ドメイン] を作成してもスレッドは作成されません。呼び出しを行ったスレッドの状態で実行していAppDomain.Create()ます。これでは十分ではありません。STA の約束を守ることはできません。 [アプリ ドメイン] でこれを処理するには、スレッド作成コードとApplication.Run()呼び出しがその [アプリ ドメイン] で動作する必要があります。」

于 2017-05-09T12:02:13.247 に答える