1

新しい AppDomain (asp.net MVC フレームワークの FWIW) 内で実行されている API を呼び出したいと考えています。AppDomain 内でコードを実行するためのいくつかのオプションを発見しました。これまでに見たソリューションの冗長さに満足していません。

私は発見した:

アセンブリの実行:

appDomain.ExecuteAssembly("SOMEPATH.exe");

実行可能ファイルを起動することは、API 呼び出しを行う良い方法ではありません。Main()API の各パブリック メソッドを表すさまざまなパラメーターを に渡す必要があると思います。

反射:

ObjectHandle handle = appDomain.CreateInstance("someassembly.dll", "someType");
A a = (A) handle.Unwrap();
a.SomeField = "foo";

これは、API の優れたソリューションだと思います。ただし、複雑なセットアップとパフォーマンスのオーバーヘッドの可能性があるため、私は Reflection の大ファンではありません。

これらのフープを通過せずにメソッドを起動できるように、新しいスレッドでアプリドメインをロードする手段はありますか? 言い換えれば、効果的に次のことを行う手段があります。

Thread.Start("useThisAppdomain", 
  //do work.
  className.M();//run in new appdomain
);

など?

4

1 に答える 1

2

他のドメインで実行されるコードにセキュリティ制限を追加することを懸念している場合は、そのコードを元のドメイン (制限されないドメイン) で実行することもできないことを意味する可能性が高いため、通常は「AppDomain 境界を越えて型をリークしない」という要件。ある AppDomain で実行されるコードを別の AppDomain から明確に分離することで、他のドメインでオブジェクトを作成する必要性を最小限に抑えることができます。多くの場合、他のドメインで作業をスケジュールして結果を返すには、単一の「コードランナー」クラスで十分です。通常どおり、各側のコードを記述できるはずです (不明なアセンブリを読み込む必要がない場合)。

元の提案 (セキュリティ要件の前):

アプリ ドメインの境界を越えて型がリークしないことを心配していないと仮定します (これは AppDomains の最も一般的な使用法です。アセンブリを 1 つの新しい AppDomain に制約することで、一部のアセンブリを "アンロード可能" にします)。

他のドメインで厳密に型指定されたオブジェクトの作成を可能にするヘルパー メソッドを記述できる必要があります。通常、このようなコードは、新しいドメインから元のドメインに型が「リーク」するため不可能です (したがって、他のアセンブリを元のドメインにロードし、アンロードを防止します)。 /アセンブリへの更新)。

注: スレッドと AppDomains は無関係な概念です。同じスレッドが 1 つのスタック上の複数のドメインからのコードを持つことができます。スレッドを「単一のアプリ ドメインで実行」するように制限する組み込みの方法はありません。

于 2013-03-29T16:30:52.017 に答える