web-dev-qa-db-fra.com

Utilisation de AppDomain en C #

Quelle est l'utilisation la plus importante d'AppDomains en C #?

70
Nipun

Le simple le plus important _ utilisé est que votre code doit avoir un - c’est-à-dire que tout ce que vous écrivez en C # s’exécute dans un AppDomain. C'est assez important ;-p

Si vous voulez dire autres domaines d'application:

Lorsque vous utilisez des plugins et d'autres codes non fiables, cela vous permet à la fois de vous isoler et de les décharger (vous ne pouvez pas décharger des assemblys, mais uniquement des domaines d'application complets).

Je l'utilise actuellement pour charger des dll générées dynamiquement, afin de pouvoir les décharger.

Ils vous permettent également de définir différents fichiers de configuration, différents niveaux de confiance, etc., mais entraînent des coûts de complexité et d’administration distants.

MSDN a une section sur les domaines d'application, ici .

75
Marc Gravell

Je ne peux pas vous dire quelle est l'utilisation la plus importante, car cela dépend de la situation. 

Les domaines d'application sont utiles pour la mise en sandbox de certaines parties de votre application. Vous pouvez charger des extensions dans un AppDomain et les décharger à nouveau - chose que vous ne pourriez pas faire autrement. Vous pouvez attribuer des droits spécifiques à AppDomains. Par défaut, les objets de différents domaines d'application ne peuvent pas accéder l'un à l'autre.

Les domaines d'application peuvent être considérés comme des processus légers car ils vous offrent de nombreuses fonctionnalités identiques. Cependant, contrairement à Process, les nouveaux AppDomains ne possèdent pas leur propre thread par défaut. Vous devez gérer AppDomains et les threads vous-même. 

De plus, les domaines d'application partagent tous le même segment géré. Ce n'est généralement pas un problème, mais cela peut avoir des effets surprenants car certaines instances, telles que des chaînes, sont partagées entre AppDomains. Pour une utilisation régulière, ce n'est pas un problème, mais si vous utilisez des chaînes pour le verrouillage, les threads de différents domaines AppDomain peuvent s'affecter. 

29
Brian Rasmussen

En général, utiliser AppDomains n’est pas une pratique quotidienne de codage, cela pourrait être considéré comme un concept avancé .. mais à partir de cette chose simple, il est important de mieux comprendre les concepts derrière le mot "AppDomain". 

En termes d’architecture, et aussi simple que possible, un AppDomain est un conteneur d’isolation même en termes d’adressage en mémoire. À l’intérieur de celui-ci, tous les assemblys nécessaires à une application sont chargés et exécutés, même si ce concept est plus compliqué à expliquer en détail. (J'espère que votre question n'est pas d'aller plus loin).

À partir de là, la classe AppDomain est tout d’abord utilisée pour obtenir un accès au domaine d’application exécutable lié à l’application, ce qui peut être fait via la propriété Singleton, implémentation AppDomain.CurrentDomain. De cette façon, il est possible de:

  1. obtenir l'accès aux assemblées chargées;
  2. obtenir un accès aux slots de données appdomain-partagés;
  3. intems marshalling, en termes de décompression d'instances créées à partir d'assemblys chargés dans des domaines créés.

Ensuite, la classe AppDomain est utilisée pour:

  1. créer plus de "domaines" dans le même processus;
  2. exécuter des assemblages dans le processus;
  3. gérer le processus de chargement/déchargement de l'appdomain.

Il pourrait être utile de consulter le code du nouveau framework Microsoft (non encore publié) MEF (Managed Extesibility Framework) , qui est véritablement basé sur des concepts tels que les créations AppDomains et les assemblages chargés dynamiquement.

En tant qu'exemple simple et illustrant ce que vous pouvez faire avec AppDomains, je peux partager ce link .

J'espère avoir répondu à votre question.

21
Hoghweed

A C # AppDomain est un conteneur logiquement isolé à l'intérieur duquel le code .NET s'exécute. Lorsque vous exécutez un code .NET, il s'exécute toujours dans un domaine d'application par défaut.

Regardez cette vidéo youtube de 30 minutes Qu'est-ce que C # AppDomain? qui explique AppDomain plus en détail.

 C# Appdomain

Mais laissez-moi quand même essayer d’expliquer plus en détail. Disons que vous obtenez un tiers DLL et que vous souhaitez l’utiliser dans votre application. Mais vous doutez également que le tiers puisse avoir un code malveillant, vous voudriez donc exécuter le tiers DLL dans un environnement contraint. Comme si vous ne vouliez pas que le tiers accède à votre lecteur c: ou supprime des fichiers, etc.

Vous pouvez donc créer deux domaines d’application, l’un pour la troisième partie et l’autre pour vos propres classes C #. Pour l'application tierce, vous appliquerez une contrainte de sécurité empêchant l'accès au lecteur c: et pour vos DLL C #, vous disposerez d'un domaine d'application illimité. 

7
Shivprasad Koirala

Veuillez lire mon blog pour une application standard de chargement à l'exécution de DLL et de communications croisées à l'aide d'AppDomain. https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/

  1. Runtime Chargement et déchargement de DLL: j'ai travaillé sur un projet dans lequel les DLL étaient chargées au moment de l'exécution par l'utilisateur. Lors de l'exécution du programme, les méthodes étaient exécutées à l'aide de Reflection et déchargées pendant l'exécution du programme.
  2. Sécurisation de mon programme d'exécution principal: nous chargeons la DLL de manière dynamique, de sorte que toute exception se produisant dans cette DLL chargée dynamiquement n'affecte pas mon AppDomain principal. En cas de scénario de corruption, nous avons la possibilité de décharger et de charger efficacement la DLL à nouveau.
  3. Communication Cross-AppDomain: nous pouvons charger dynamiquement deux DLL au moment de l'exécution dans différents AppDomain et les faire communiquer entre elles.
0
vCillusion