web-dev-qa-db-ja.com

C#でのAppDomainの使用

C#でのAppDomainの最も重要な用途は何ですか?

72
Nipun

単一の最も重要な使用は、コードが1つを持っている必要があることです-つまり、C#で書くすべてAppDomainで実行されます。それは非常に重要です;-p

追加のアプリドメインを意味する場合:

プラグインやその他の信頼できないコードを使用すると、分離とそれらをアンロードする機能の両方が可能になります(アセンブリをアンロードすることはできません-アプリドメイン全体のみ)。

現在、動的に生成されたdllをロードするために使用しているので、それらをアンロードできます。

また、さまざまな構成ファイル、信頼レベルなどを設定することもできますが、複雑さとリモート処理のコストが伴います。

MSDNには、app-domainsのセクション here があります。

75
Marc Gravell

最も重要な使用法は状況によって異なりますので、お話しすることはできません。

AppDomainは、アプリケーションの一部をサンドボックス化するのに役立ちます。拡張機能をAppDomainにロードして、再度アンロードすることができます。他の方法ではできません。 AppDomainsに特定の権限を割り当てることができます。デフォルトでは、異なるAppDomainのオブジェクトは相互にアクセスできません。

AppDomainは、同じ機能の多くを提供するため、軽量プロセスと見なすことができます。ただし、プロセスとは異なり、新しいAppDomainにはデフォルトで独自のスレッドがありません。 AppDomainとスレッドは自分で管理する必要があります。

また、AppDomainはすべて同じマネージヒープを共有します。これは通常問題ではありませんが、文字列などの一部のインスタンスがAppDomain間で共有されるため、驚くべき影響が生じる可能性があります。通常の使用ではこれは問題ではありませんが、ロックに文字列を使用すると、異なるAppDomainのスレッドが互いに影響し合う可能性があります。

30
Brian Rasmussen

一般的に、AppDomainを使用するのはそれほど日常的なコーディング慣行ではありません。これは高度な概念と考えることができます。しかし、この単純なことから始めて、「AppDomain」という単語の背後にある概念をよりよく理解することが重要です。

アーキテクチャの観点から、そしてそれを可能な限り単純にすることで、AppDomainはメモリアドレス指定の観点からも分離コンテナーであり、アプリケーション内で必要なすべてのアセンブリが読み込まれ、実行されます。 (私はそれがそれほど深く行くためのあなたの質問についてではないことを願っています)。

そこから始めて、まずAppDomainクラスを使用して、実行中のアプリケーションドメインに関連するアプリケーションへのアクセスを取得します。これは、シングルトンプロパティの実装AppDomain.CurrentDomain。このようにして、次のことが可能になります。

  1. ロードされたアセンブリへのアクセスを取得します。
  2. appdomain共有データスロットへのアクセスを取得します。
  3. 作成されたドメイン内の読み込まれたアセンブリから作成されたインスタンスをアンラップするという点で、マーシャリングの内部。

次に、AppDomainクラスを使用して次のことを行います。

  1. 同じプロセスでより多くの「ドメイン」を作成します。
  2. プロセスでアセンブリを実行する。
  3. アプリドメインのロード/アンロードプロセスを管理します。

新しいMicrosoftフレームワーク(まだリリースされていない)のコードを見ると便利です MEF(Managed Extesibility Framework) これは、AppDomainsの作成やアンロード、動的に読み込まれるアセンブリなどの概念に本当に基づいています。

AppDomainsでできることの簡単な例と例として、これを共有できます link

あなたの質問にお答えしたいと思います。

22
Hoghweed

C#AppDomainは、.NETコードが実行される論理的に分離されたコンテナーです。 .NETコードを実行すると、常にデフォルトのappdomainで実行されます。

この30分のYouTubeビデオをご覧ください C#AppDomainとは? AppDomainについて詳しく説明しています。

C# Appdomain

しかし、もっと詳細に説明しようと思います。サードパーティを入手したとしましょうDLLあなたがアプリケーションでそれを使用したいのですが、サードパーティが悪意のあるコードを持っている可能性があるので、サードパーティを実行したいと思います= DLL制約された環境で。サードパーティがc:ドライブにアクセスしたり、ファイルを削除したりするのを望まないように。

したがって、2つのAppDomainを作成できます。1つはサードパーティ用で、もう1つは独自のC#クラス用です。サードパーティのアプリドメインの場合は、c:ドライブにアクセスできないというセキュリティ制約を適用し、C#DLLの場合は、アプリドメインを無制限にします。

9

DLLのランタイムロードの標準的なアプリケーションとAppDomainを使用した相互通信については、私のブログを読んでください。 https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/

  1. DLLのランタイムロードおよびアンロード:DLLが実行時にユーザーによってロードされるプロジェクトで作業し、プログラムの実行中に、メソッドはプログラムの実行中にリフレクションとアンロード。
  2. メイン実行プログラムの保護:DLLを動的にロードしているため、動的にロードされたDLLで発生した例外は発生しませんでしたtメインのAppDomainに影響します。破損シナリオの場合、DLLを再度効率的にアンロードおよびロードするオプションがあります。
  3. クロスAppDomain通信:実行時に任意の2つのDLLを動的に異なるAppDomainにロードして、相互に通信させることができます。
1
vCillusion