50

インタビューで AppDomains についてよく聞かれますが、基本的なことは知っています。

  • それらはアプリケーション内の分離レベルです(アプリケーションとは異なります)
  • それらはスレッドを持つことができます(スレッドとは異なります)
  • あるアプリドメインの例外は別のアプリドメインには影響しません
  • アプリドメインは互いのメモリにアクセスできません
  • 各アプリドメインは異なるセキュリティを持つことができます

私はまだそれらを必要とするものを理解していません。合理的な具体的な状況を探しています。

答え:

  • 信頼できないコード
    • コア アプリケーションの保護
      信頼されていない/サード パーティのプラグインは、セキュリティ制限のある別のアプリケーション ドメインに分離することで、共有メモリの破損やレジストリまたはハード ドライブへの無許可のアクセスを禁止し、アプリケーションまたはサーバーを保護します。例: ASP.NET および SQL Server ホスティング コンポーネント コード
  • 信頼できるコード

    • 安全で独立した機能に分割された安定性アプリケーション
    • アーキテクチャの柔軟性
      1 つの CLR インスタンス内で複数のアプリケーションを実行したり、各プログラムを個別に実行したりできる自由。

他に何か?

4

7 に答える 7

50

おそらく最も一般的なのは、信頼されていない関係者からのプラグイン コードを含むアセンブリを読み込むことです。コードは独自の AppDomain で実行され、アプリケーションを分離します。

また、特定のアセンブリをアンロードすることはできませんが、AppDomain はアンロードできます。

完全な概要については、Chris Brumme がこれに関する大規模なブログ エントリを作成しました。

http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

https://devblogs.microsoft.com/cbrumme/appdomains-application-domains/

于 2008-09-18T22:01:20.687 に答える
16

AppDomains のもう 1 つの利点 (質問で述べたように) は、ロードしたコードをさまざまなセキュリティ アクセス許可で実行できることです。たとえば、DLL を動的にロードするアプリを作成しました。私は講師で、これらは私が読み込んでいた学生 DLL でした。不満を持った学生に私のハード ドライブを消去させたり、レジストリを破損させたりさせたくなかったので、ファイル IO 権限、レジストリ編集権限、または新しいウィンドウを表示する権限さえも持たない別の AppDomain に、学生の DLL からコードをロードしました。 (実際には実行権限しかありませんでした)。

于 2008-09-18T23:13:26.987 に答える
8

AppDomainsを使用する主な動機は、CLR設計者が、複数のWindowsプロセスのパフォーマンスオーバーヘッドを発生させずにマネージコードを分離する方法を望んでいたことだと思います。CLRが元々UNIX上に実装されていた場合(複数のプロセスの作成が大幅に安価である場合)、AppDomainsは発明されなかった可能性があります。

また、サードパーティアプリのマネージドプラグインアーキテクチャは間違いなくAppDomainsの有効な使用法ですが、それらが存在する大きな理由は、SQLServer2005やASP.NETなどの有名なホストのためです。たとえば、ASP.NETホスティングプロバイダーは、単一のWindowsプロセスで実行される同じボックス上で複数の顧客からの複数のサイトをサポートする共有ホスティングソリューションを提供できます。

于 2008-09-18T22:50:35.420 に答える
4

アプリ ドメインは、アプリケーションの安定性に優れています。

アプリケーションを中央プロセスで構成し、そのプロセスが個別のアプリドメインで「機能」を生成することで、そのうちの 1 つが誤動作した場合にグローバル クラッシュを防ぐことができます。

于 2008-09-18T22:08:46.550 に答える
4

サードパーティのプラグインを許可するアプリケーションを作成する場合は、それらのプラグインを別の AppDomain にロードして、メイン アプリケーションを不明なコードから保護することができます。

ASP.NET は、単一のワーカー プロセス内の Web アプリケーションごとに個別の AppDomains も使用します。

于 2008-09-18T22:02:13.210 に答える
4

私が理解しているように、AppDomainは、ホスティングエンティティ(OS、DB、サーバーなど)が単一のCLRインスタンス内または各プログラム内で複数のアプリケーションを自由に実行できるように設計されています。したがって、アプリケーション開発者ではなくホストの問題です。

これは、アプリケーションごとに常に 1 つの JVM を使用する Java と比べて有利であり、多くの場合、JVM の多くのインスタンスが重複したリソースと並行して実行されます。

于 2008-09-18T22:12:43.983 に答える
3

個別のアプリケーション ドメインを作成するための主なユース ケースが 2 つまたは 3 つあります。

1)リソース使用量とオーバーヘッドが少ないプロセスのような分離。たとえば、これが ASP.NET の機能です。ASP.NET は、各 Web サイトを個別のアプリケーション ドメインでホストします。単一のアプリケーション ドメインで異なるスレッドを使用すると、異なる Web サイトのコードが互いに干渉する可能性があります。異なるプロセスで異なる Web サイトをホストする場合、多くのリソースを使用し、プロセス間通信はインプロセス通信と比較して比較的困難です。

2)特定のセキュリティ権限を持つ別のアプリケーション ドメインで信頼できないコードを実行する (これは実際には 1 番目の理由に関連しています)。人々がすでに言ったように、サードパーティのプラグインや信頼できない dll を別のアプリケーション ドメインにロードできます。

3)不要なメモリ使用量を削減するためにアセンブリをアンロードする機能。残念ながら、アプリケーション ドメインからアセンブリをアンロードする方法はありません。そのため、大きなアセンブリをメイン アプリケーション ドメインにロードした場合、そのアセンブリが不要になった後に対応するメモリを解放する唯一の方法は、アプリケーションを閉じることです。別のアプリケーション ドメインにアセンブリをロードし、それらのアセンブリが不要になったときにそのアプリケーション ドメインをアンロードすることは、この問題の解決策です。

于 2011-02-19T02:35:23.570 に答える