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