2009-04-22 9 views
9

Y at-il un AppDomain pour chaque programme C# même si nous ne créons pas spécifiquement un AppDomain? Pourquoi est-ce nécessaire? J'ai lu sur les assemblages de tiers qui plantent l'application entière si nous ne les chargeons pas dans AppDomain distinct. Je n'ai pas bien compris ce point. Quelqu'un peut-il expliquer cela aussi.Y a-t-il un AppDomain pour chaque programme C#?

Répondre

15

AppDomain ressemble à un processus, c'est une infrastructure dans laquelle votre application s'exécute. Il n'est pas nécessaire de charger des assemblages tiers dans un AppDomains distinct, mais si vous le faites, il fournit une isolation entre eux (comme deux processus distincts) et un dysfonctionnement dans l'un n'affecte pas l'autre. Les domaines d'application peuvent être déchargés indépendamment. Par exemple, SQL Server utilise AppDomain s pour charger des assemblages CLR en toute sécurité dans son processus.

2

Chaque application a au moins un domaine d'application, oui.

Je ne sais pas ce que signifie la note sur les assemblages tiers.

1

Il existe au moins un domaine d'application pour chaque programme que vous pouvez créer autant que vous le souhaitez, mais vous en aurez rarement besoin de plus d'un.

C'est fondamentalement un conteneur où le code qui s'exécute avec une confiance particulière est en cours d'exécution.

1

Il existe un domaine d'application par défaut dans lequel votre application est chargée (chaque instance obtient le sien). L'élément de blocage signifie qu'un ensemble tiers (c'est-à-dire un plug-in) plantera l'ensemble de votre application lorsqu'il se bloque si vous ne le chargez pas dans un domaine d'application distinct. Par conséquent, il est recommandé de charger des plug-ins dans un domaine d'application distinct, car un plantage dans un domaine d'application bloque uniquement ce domaine d'application et pas les autres domaines. Le CLR Add-In blog a des articles à ce sujet.

Une chose importante à noter est qu'un domaine d'application n'a pas nécessairement besoin d'être dans le même processus ou sur le même système, donc vous en avez essentiellement besoin pour la communication à distance.

3

J'ai lu au sujet des assemblées 3ème partie qui a causé l'accident si nous ne faisons pas usage de AppDomain

Je pense que vous parlez de charger d'autres ensembles dans des domaines d'application distincts. De cette façon, ils peuvent être isolés de votre espace d'adressage pour éviter un crash dans leur code qui vous affecte. Le coût est que la communication avec un assembly dans un domaine d'application distinct est plus difficile et a une pénalité de perf puisque tous les appels doivent être martiqués à travers la limite du domaine de l'application.

Ceci est un sujet assez avancé, je vous recommande de lire dans Richter (d'autres livres sont disponibles).

Questions connexes