web-dev-qa-db-fra.com

Qu'est-ce que AppDomain?

Qu'est-ce qu'un AppDomain ? Quels sont les avantages d'AppDomains ou pourquoi Microsoft a introduit le concept d'AppDomains, quel était le problème sans AppDomains?

S'il vous plaît élaborer.

130
Praveen Sharma

Un AppDomain fournit une couche d'isolation au sein d'un processus. Tout ce que vous considérez habituellement comme "par programme" (variables statiques, etc.) est en réalité par AppDomain. Ceci est utile pour:

  • plugins (vous pouvez décharger un AppDomain, mais pas un assembly dans et un AppDomain)
  • sécurité (vous pouvez exécuter un ensemble de code avec des niveaux de confiance spécifiques)
  • isolation (vous pouvez exécuter différentes versions d'assemblages, etc.)

La douleur est que vous devez utiliser la communication à distance, etc.

Voir MSDN pour plus d'informations. Pour être honnête, ce n'est pas quelque chose avec lequel vous devez jouer très souvent.

117
Marc Gravell

Un domaine d'application implémente le concept d'espace mémoire virtuel contigu contenant le code et les ressources en mémoire pouvant être directement consultées ou référencées.

Des domaines d'application distincts ne partagent pas d'espace mémoire et, par conséquent, un domaine d'application ne peut pas référencer directement le contenu d'un autre. En particulier, les données doivent être transmises entre AppDomains via un processus de copie par valeur. En particulier, les objets de référence, qui reposent sur des pointeurs et donc sur des adresses de mémoire, doivent d'abord être sérialisés à partir de la source, puis désérialisés dans la destination AppDomain.

Auparavant sur les systèmes Windows, les limites de la mémoire étaient implémentées par des processus; Cependant, la construction de processus nécessite beaucoup de ressources. Ils servent également un double objectif en tant que limites de threads. Les domaines d'application, en revanche, ne concernent que la limite de mémoire ou l'espace d'adressage. Les threads peuvent "circuler" dans AppDomains (en d'autres termes, une procédure peut appeler un point d'entrée dans un autre AppDomain et attendre son renvoi. Le thread est dit "continuer" l'exécution dans l'autre AppDomain).

Un avantage important de cette architecture est que les modèles de communication entre domaines d'application restent pratiquement inchangés, que les domaines d'application soient dans le même processus, des processus différents ou sur des machines différentes: le processus de sérialisation et de désérialisation (marshaling) des données de paramètre. .

Remarque 1: la signification d'un thread qui croise un AppDomain est celle d'un appel de méthode bloquant ou synchrone dans un autre AppDomain (par opposition à un appel non bloquant ou asynchrone qui engendrerait un autre thread pour continuer l'exécution dans l'appDomain cible et continuer dans son appDomain actuel. sans attendre la réponse).

Note 2: il existe une chose telle que Thread Local Storage. Cependant, un meilleur nom aurait été Stockage local de threads App-Domain puisque les threads laissent leurs données derrière eux lorsqu'ils traversent App-Domains, mais les récupèrent à leur retour: http://msdn.Microsoft.com/en -us/bibliothèque/6sby1byh.aspx

Remarque3: Un environnement d'exécution .Net est une application de processus Windows avec un segment de mémoire associé. Il peut héberger un ou plusieurs domaines d'application dans ce segment. Cependant, les domaines d'application sont conçus pour être inconscients les uns des autres et pour communiquer les uns avec les autres via marshaling. Il est concevable de pouvoir réaliser une optimisation qui contourne le marshaling entre des AppDomains en communication partageant le même .NET Runtime et donc le même segment de processus Windows.

46
George

Les domaines d'application peuvent être considérés comme des processus légers. Ils partagent bon nombre des mêmes caractéristiques d’un processus, par exemple: ils ont leurs propres copies de la statique, des assemblées et ainsi de suite, mais ils sont contenus dans un processus unique. Du point de vue du système d'exploitation, un processus n'est qu'un processus, quel que soit le nombre d'AppDomains qu'il peut contenir.

Toutefois, contrairement à un processus, un domaine d’application ne contient pas de threads, à moins que vous ne les créiez explicitement. Un thread peut exécuter du code dans n'importe quel AppDomain.

Les domaines d'application font partie du même processus et partagent donc le même segment de mémoire géré. Ce n'est généralement pas un problème car le modèle de programmation AppDomain empêche l'accès implicite entre AppDomains. Cependant, certaines références sont réellement partagées entre AppDomains, telles que les objets de type et les chaînes internées.

33
Brian Rasmussen