web-dev-qa-db-ja.com

AppDomainとは何ですか?

AppDomain とは何ですか? AppDomainsの利点は何ですか、またはMicrosoftがAppDomainsの概念をもたらした理由は何ですか、AppDomainsがなければ問題は何でしたか?

詳しく説明してください。

130
Praveen Sharma

AppDomainは、プロセス内の分離層を提供します。通常「プログラムごと」と考えるすべてのもの(静的変数など)は、実際にはAppDomainごとです。これは次の場合に役立ちます。

  • プラグイン(AppDomainをアンロードできますが、アセンブリwithinAppDomainはアンロードできません)
  • セキュリティ(特定の信頼レベルでコードのセットを実行できます)
  • 分離(異なるバージョンのアセンブリなどを実行できます)

痛みは、リモート処理などを使用する必要があることです。

MSDNを参照 詳細情報正直に言うと、めちゃくちゃにする必要はありません。

117
Marc Gravell

アプリドメインは、コードと、直接アクセスまたは参照できるメモリ内リソースを保持する連続した仮想メモリ空​​間の概念を実装します。

個別のAppDomainはメモリ空間を共有しないため、1つのAppDomainが別のAppDomainのコンテンツを直接参照することはできません。特に、データは値ごとのコピープロセスを通じてAppDomainの間で受け渡される必要があります。特に、ポインターに依存し、したがってメモリアドレスに依存する参照オブジェクトは、最初にソースからシリアル化され、次に宛先AppDomainに逆シリアル化される必要があります。

以前のWindowsシステムでは、メモリ境界はプロセスによって実装されていました。ただし、プロセスの構築はリソースを大量に消費します。また、スレッド境界としての二重の目的も果たします。一方、アプリドメインは、メモリ境界またはアドレス空間のみに関係します。スレッドはAppDomain間で「流れる」ことができます(つまり、プロシージャは別のAppDomainのエントリポイントを呼び出して、それが戻るのを待つことができます。スレッドは、他のAppDomain内で実行を「続行」します)。

このアーキテクチャの重要な利点の1つは、AppDomainが同じプロセス、異なるプロセス、または異なるマシン上にあるかどうかに関係なく、Appドメイン間の通信パターンが実質的に変わらないことです。つまり、パラメーターデータのシリアル化と逆シリアル化(マーシャリング)のプロセス。

注1:AppDomainを通過するスレッドの意味は、別のAppDomainへのブロッキングまたは同期メソッド呼び出しの意味です(非ブロッキングまたは非同期呼び出しは、ターゲットAppDomainで実行を継続し、現在のAppDomainで続行するために別のスレッドを生成します)応答を待つことなく)。

注2:スレッドローカルストレージなどがあります。ただし、より良い名前はApp-Domain Thread Local Storageでした。スレッドはApp-Domainを通過するときにデータを残しますが、戻るときにそれらを取り戻すからです。 http://msdn.Microsoft.com/en -us/library/6sby1byh.aspx

注3:.Netランタイムは、ヒープが関連付けられたWindowsプロセスアプリケーションです。そのヒープ内で1つ以上のAppDomainをホストできます。ただし、AppDomainsは互いに気付かないように設計されており、マーシャリングを介して相互に通信します。同じ.Netランタイム、したがって同じWindowsプロセスヒープを共有するAppDomainの通信間のマーシャリングをバイパスする最適化を実行できると考えられます。

46
George

AppDomainsは軽量プロセスとして表示できます。プロセスの多くの同じ特性を共有します。静的、アセンブリなどの独自のコピーがありますが、単一のプロセスに含まれています。オペレーティングシステムの観点から見ると、プロセスはAppDomainがいくつ含まれていても、単なるプロセスです。

ただし、プロセスとは異なり、明示的に作成しない限り、AppDomainにはスレッドがありません。スレッドは、任意のAppDomainでコードを実行できます。

AppDomainは同じプロセスの一部であるため、実際には同じマネージヒープを共有します。 AppDomainプログラミングモデルはAppDomain間の暗黙的なアクセスを防止するため、これは通常問題になりません。ただし、実際には、タイプオブジェクトやインターンされた文字列など、一部の参照はAppDomain間で共有されます。

33
Brian Rasmussen