AppDomain とは何ですか? AppDomainsの利点は何ですか、またはMicrosoftがAppDomainsの概念をもたらした理由は何ですか、AppDomainsがなければ問題は何でしたか?
詳しく説明してください。
AppDomain
は、プロセス内の分離層を提供します。通常「プログラムごと」と考えるすべてのもの(静的変数など)は、実際にはAppDomainごとです。これは次の場合に役立ちます。
AppDomain
をアンロードできますが、アセンブリwithinAppDomain
はアンロードできません)痛みは、リモート処理などを使用する必要があることです。
MSDNを参照 詳細情報正直に言うと、めちゃくちゃにする必要はありません。
アプリドメインは、コードと、直接アクセスまたは参照できるメモリ内リソースを保持する連続した仮想メモリ空間の概念を実装します。
個別の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の通信間のマーシャリングをバイパスする最適化を実行できると考えられます。
AppDomainsは軽量プロセスとして表示できます。プロセスの多くの同じ特性を共有します。静的、アセンブリなどの独自のコピーがありますが、単一のプロセスに含まれています。オペレーティングシステムの観点から見ると、プロセスはAppDomainがいくつ含まれていても、単なるプロセスです。
ただし、プロセスとは異なり、明示的に作成しない限り、AppDomainにはスレッドがありません。スレッドは、任意のAppDomainでコードを実行できます。
AppDomainは同じプロセスの一部であるため、実際には同じマネージヒープを共有します。 AppDomainプログラミングモデルはAppDomain間の暗黙的なアクセスを防止するため、これは通常問題になりません。ただし、実際には、タイプオブジェクトやインターンされた文字列など、一部の参照はAppDomain間で共有されます。