.NETアプリケーションドメインとは何ですか?


83

特に、2つの異なるアプリケーションドメインでコードを実行することの意味は何ですか?

データは通常、アプリケーションドメインの境界を越えてどのように渡されますか?プロセスの境界を越えてデータを渡すことと同じですか?この抽象化とそれが何に役立つのかについてもっと知りたいです。

編集:私はアプリケーションドメインを理解ていませんが、一般的にAppDomainクラスの既存のカバレッジは良好です


3
最初の部分はstackoverflow.com/questions/622516/i-dont-understand-appdomainsの複製です。たぶん、質問はデータの受け渡しに関するものになるように編集する必要があります。
ジョンサンダース

うわー、それを逃した。これは閉じることができます。
ルーク

回答:


78

ANアプリケーションドメインは、基本的に、コードは、プロセスの内部を実行する孤立領域を提供します。

それを考える簡単な方法は、メインプロセスの中にある軽量プロセスのようなものです。各AppDomainは完全に分離されたプロセス内に存在するため、コードを安全に実行でき(必要に応じてプロセス全体を破棄せずにアンロードできます)、個別のセキュリティなどを使用できます。

詳細については、プロセス内の2つの異なるAppDomainでコードを実行すると、コードは分離して実行されます。AppDomain間の通信は、シリアル化されるか、MarshallByRefObjectを介して処理されます。この点で、リモーティングを使用するのと非常によく似た動作をします。これにより、非常に多くのセキュリティが提供されます。信頼できないコードを実行でき、問題が発生しても影響はありません。

MSDNのアプリケーションドメインの説明には、さらに多くの詳細があります。


「何か悪いことをしたら」とはどういう意味か明確にできますか?
ルーク

11
一例:スレッドプールに未処理のスレッドがある場合、アプリドメインが破棄されます。通常、これはプロセスを強制終了します。これは、ユーザーコードまたはプラグインをロードしている場合は危険です。別のappdomainで実行することは、それをはるかにうまく処理できることを意味します-2番目のAppDomainを破棄する必要がある場合は、プロセスを破棄せずに処理できます。
リードコプシー

20

これは、.NETランタイムによって提供される分離レイヤーです。そのため、アプリドメインはプロセス内に存在し(1つのプロセスに多数のアプリドメインを含めることができます)、独自の仮想アドレス空間を持ちます。

アプリドメインは次の理由で役立ちます。

  • それらは完全なプロセスよりも安価です
  • それらはマルチスレッドです
  • プロセスのすべてを殺さずに1つを停止できます
  • リソース/構成/その他の分離
  • 各アプリドメインは独自のセキュリティレベルで実行されます

1

プロセッサ内部の詳細の観点から見ると、コードセグメント(CS)レジスタに異なる値が設定されます。コードとCS:IP(命令ポインタ)レジスタは、プロセッサによって実行されているものです。

(簡潔にするために、ページテーブル関連の説明を読み飛ばすことを選択しました)。

AppDomainはこの境界をマークします。コードの安全性のため。

この背景を説明する理由は、次のような質問を回避するためです。1。2つのアプリドメイン間でリソースにアクセスするにはどうすればよいですか(CS:IPを他のアプリドメインに設定できないため、パイプやその他の共有メカニズムを直接使用することはできません。それを実行できるのはOSだけです。CLRではありません)

  1. アプリドメインに複数のスレッドが存在する可能性があります。CS値は現在のプロセスに含まれるため、技術的には「はい」です。ジャンプステートメント(関数呼び出し/ gotoの組み合わせ)によってIPを別のものに変更できます

  2. 2つの異なるアプリドメインの2つのスレッドが通信できますか(いいえ。ポイント1を参照してください)。

  3. 単一のアプリドメイン内の2つのスレッドが通信できますか(はい。ポイント2を参照)

これらのケースの他のいくつかの組み合わせは、CS:IPがどのように機能するかについての知識がほとんどないことで答えることができます。


0

プロセス内で実行される各アプリケーション、AppDomainも軽量プロセスであるか、アセンブリのグループ(これはアセンブリのグループを含むコンテナー)を持ち、これが同じプロセスの分離レベルでプロセス内に存在する論理ユニットと言えます。 、これにより、同じプロセス内で複数のアセンブリを実行し、直接アクセスできないようにすることができます。

AppDomain内でのドットネットアプリケーションの実行: ドットネットアプリケーションの実行ドットネットアプリケーションが実行されると、オペレーティングシステムシェルがCLRをプロセスにロードし、同じプロセスで新しいAppDomainが作成され、作成されたAppDomainにすべてのアセンブリがロードされます。これでAppDomainコードが実行されます。

いつカスタムAppDomain を使用するか独自のAppDomainを作成できます。これで、どのシナリオで独自のAppDomainを作成できるかがわかります。実行中のアプリケーションを中断せずにアセンブリを追加または削除する必要がある実行時に、独自のAppDomainを作成できるとします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.