C# での AppDomains の最も重要な用途は何ですか?
5 に答える
最も重要な使用法は、コードに1つ必要なことです。つまり、C#で記述したものはすべて。で実行されますAppDomain。それは非常に重要です;-p
追加のアプリドメインを意味する場合:
プラグインやその他の信頼できないコードを使用すると、分離とそれらのアンロード機能の両方が可能になります(アセンブリをアンロードすることはできません-アプリドメイン全体のみ)。
私は現在、動的に生成されたdllをロードするためにそれを使用しているので、それらをアンロードできます。
また、さまざまな構成ファイルや信頼レベルなどを設定することもできますが、複雑さとリモート処理のコストが伴います。
MSDNには、app-domainsに関するセクションがあります。
状況にもよるので、一番大事な使い方は言えません。
AppDomainsは、アプリケーションの一部をサンドボックス化するのに役立ちます。AppDomainに拡張機能をロードして、再度アンロードすることができます。これは、他の方法では実行できないことです。AppDomainsに特定の権限を割り当てることができます。デフォルトでは、異なるAppDomain内のオブジェクトは相互にアクセスできません。
AppDomainは、同じ機能の多くを提供するため、軽量プロセスと見なすことができます。ただし、プロセスとは異なり、新しいAppDomainにはデフォルトごとに独自のスレッドがありません。AppDomainとスレッドを自分で管理する必要があります。
また、AppDomainはすべて同じマネージヒープを共有します。これは通常問題ではありませんが、文字列などの一部のインスタンスがAppDomain間で共有されるため、驚くべき効果が生じる可能性があります。通常の使用ではこれは問題ではありませんが、ロックに文字列を使用すると、異なるAppDomainのスレッドが相互に影響を与える可能性があります。
一般に、AppDomains を使用することは日常的なコーディングの実践ではなく、高度な概念と見なすことができます.. しかし、この単純なことから始めて、「AppDomain」という言葉の背後にある概念をよりよく理解することが重要です。
アーキテクチャの観点から、また可能な限り単純化すると、AppDomain はメモリ アドレッシングの観点からも分離コンテナーです。この概念を詳細に説明するのはより複雑ですが、その内部では、アプリケーションに必要なすべてのアセンブリが読み込まれ、実行されます。 (あなたの質問がそれほど深くなることではないことを願っています)。
そこから始めて、まず AppDomain クラスを使用して、実行中のアプリケーション ドメインに関連するアプリケーションへのアクセスを取得します。これは、Singleton プロパティの実装を介して行うことができますAppDomain.CurrentDomain。このようにして、次のことが可能になります。
- 読み込まれたアセンブリへのアクセスを取得します。
- appdomain 共有データ スロットへのアクセスを取得します。
- 作成されたドメインにロードされたアセンブリから作成されたインスタンスをアンラップするという点で、 intems マーシャリング。
次に、AppDomain クラスは次の目的で使用されます。
- 同じプロセスでより多くの「ドメイン」を作成します。
- プロセスでアセンブリを実行します。
- appdomain のロード/アンロード プロセスを管理します。
AppDomains の作成やアセンブリのアンロード、動的ロードなどの概念に真に基づいている、新しい Microsoft フレームワーク (まだリリースされていない) MEF (Managed Extesibility Framework)のコードを確認すると役立つ場合があります。
AppDomains でできることの簡単な例と例として、このリンクを共有できます。
私はあなたの質問に答えたことを願っています。
AC# AppDomain は、内部で .NET コードが実行される論理的に分離されたコンテナーです。.NET コードを実行すると、常に既定の appdomain で実行されます。
この 30 分間の YouTube ビデオWhat is C# AppDomain ? をご覧ください。AppDomain について詳しく説明しています。
しかし、もう少し詳しく説明してみましょう。サードパーティの DLL を入手し、それをアプリケーションで使用したいとします。しかし、サード パーティが悪意のあるコードを持っている可能性があるので、制約のある環境でサード パーティの DLL を実行したいと考えています。第三者があなたの c: ドライブにアクセスしたり、ファイルを削除したりしたくないように。
したがって、2 つの AppDomains を作成できます。1 つはサード パーティ用で、もう 1 つは独自の C# クラス用です。サード パーティの appdomain の場合は、c: ドライブにアクセスできないというセキュリティ制約を適用し、C# DLL の場合は、無制限の app ドメインを使用します。
DLL のランタイム読み込みと AppDomain を使用した相互通信の標準的なアプリケーションについては、私のブログをお読みください。https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/
- DLL のランタイム ロードとアンロード: ユーザーが実行時に DLL をロードし、プログラムの実行中にリフレクションを使用してメソッドを実行し、プログラムの実行中にアンロードするプロジェクトに取り組みました。
- メイン実行プログラムの保護: DLL を動的にロードしているため、動的にロードされた DLL で発生した例外は、メインの AppDomain に影響しませんでした。破損シナリオの場合、DLL を効率的にアンロードして再度ロードするオプションがあります。
- Cross-AppDomain Communication : 実行時に任意の 2 つの DLL を異なる AppDomain に動的にロードし、それらを相互に通信させることができます。
