特に、2つの異なるアプリケーションドメインでコードを実行することの意味は何ですか?
データは通常、アプリケーションドメインの境界を越えてどのように渡されますか?プロセスの境界を越えてデータを渡すことと同じですか?この抽象化とそれが何に役立つのかについてもっと知りたいです。
編集:私はアプリケーションドメインを理解していませんが、一般的にAppDomainクラスの既存のカバレッジは良好です
特に、2つの異なるアプリケーションドメインでコードを実行することの意味は何ですか?
データは通常、アプリケーションドメインの境界を越えてどのように渡されますか?プロセスの境界を越えてデータを渡すことと同じですか?この抽象化とそれが何に役立つのかについてもっと知りたいです。
編集:私はアプリケーションドメインを理解していませんが、一般的にAppDomainクラスの既存のカバレッジは良好です
回答:
ANアプリケーションドメインは、基本的に、コードは、プロセスの内部を実行する孤立領域を提供します。
それを考える簡単な方法は、メインプロセスの中にある軽量プロセスのようなものです。各AppDomainは完全に分離されたプロセス内に存在するため、コードを安全に実行でき(必要に応じてプロセス全体を破棄せずにアンロードできます)、個別のセキュリティなどを使用できます。
詳細については、プロセス内の2つの異なるAppDomainでコードを実行すると、コードは分離して実行されます。AppDomain間の通信は、シリアル化されるか、MarshallByRefObjectを介して処理されます。この点で、リモーティングを使用するのと非常によく似た動作をします。これにより、非常に多くのセキュリティが提供されます。信頼できないコードを実行でき、問題が発生しても影響はありません。
MSDNのアプリケーションドメインの説明には、さらに多くの詳細があります。
プロセッサ内部の詳細の観点から見ると、コードセグメント(CS)レジスタに異なる値が設定されます。コードとCS:IP(命令ポインタ)レジスタは、プロセッサによって実行されているものです。
(簡潔にするために、ページテーブル関連の説明を読み飛ばすことを選択しました)。
AppDomainはこの境界をマークします。コードの安全性のため。
この背景を説明する理由は、次のような質問を回避するためです。1。2つのアプリドメイン間でリソースにアクセスするにはどうすればよいですか(CS:IPを他のアプリドメインに設定できないため、パイプやその他の共有メカニズムを直接使用することはできません。それを実行できるのはOSだけです。CLRではありません)
アプリドメインに複数のスレッドが存在する可能性があります。CS値は現在のプロセスに含まれるため、技術的には「はい」です。ジャンプステートメント(関数呼び出し/ gotoの組み合わせ)によってIPを別のものに変更できます
2つの異なるアプリドメインの2つのスレッドが通信できますか(いいえ。ポイント1を参照してください)。
単一のアプリドメイン内の2つのスレッドが通信できますか(はい。ポイント2を参照)
これらのケースの他のいくつかの組み合わせは、CS:IPがどのように機能するかについての知識がほとんどないことで答えることができます。
プロセス内で実行される各アプリケーション、AppDomainも軽量プロセスであるか、アセンブリのグループ(これはアセンブリのグループを含むコンテナー)を持ち、これが同じプロセスの分離レベルでプロセス内に存在する論理ユニットと言えます。 、これにより、同じプロセス内で複数のアセンブリを実行し、直接アクセスできないようにすることができます。
AppDomain内でのドットネットアプリケーションの実行: ドットネットアプリケーションの実行ドットネットアプリケーションが実行されると、オペレーティングシステムシェルがCLRをプロセスにロードし、同じプロセスで新しいAppDomainが作成され、作成されたAppDomainにすべてのアセンブリがロードされます。これでAppDomainコードが実行されます。
いつカスタムAppDomain を使用するか:独自のAppDomainを作成できます。これで、どのシナリオで独自のAppDomainを作成できるかがわかります。実行中のアプリケーションを中断せずにアセンブリを追加または削除する必要がある実行時に、独自のAppDomainを作成できるとします。