Différence entre AppDomain.Getassembllies et BuildManager.GetReferencedAssemblies

voulait juste savoir s'il y avait une différence entre les deux, dans le contexte d'une confiance totale asp.net mvc 2 application.

29
demandé sur starblue 2010-03-19 16:52:27

1 réponses

le .net Framework permet de reporter le chargement des assemblages dans L'Appdomaine courante jusqu'à ce qu'ils soient nécessaires. Par exemple, si vous n'appelez une bibliothèque tierce que depuis SomeMethod (), la DLL tierce ne sera normalement chargée que lorsque SomeMethod() s'exécute pour la première fois.

domaine d'application.GetAssemblies () vous donne tous les assemblages qui ont déjà été chargés dans L'Appdomaine courante. BuildManager.GetReferencedAssemblies () retourne une liste de tous les assemblages référencés depuis Web.config et ailleurs, et il charge ces assemblages dans L'Appdomaine actuelle.

voici un exemple élaboré de ce qui précède.

  1. SomeMethod() n'a pas encore couru.
  2. Appelle AppDomain.GetAssemblies (), renvoie un jeu qui n'inclut pas ThirdParty.DLL.
  3. Call SomeMethod ().
  4. Appelle AppDomain.GetAssemblies (), renvoie un jeu qui inclut ThirdParty.DLL.

dans cet exemple, le CLR défère le tiers de chargement.dll dans L'AppDomain courant jusqu'à ce que ce soit absolument nécessaire. Et puisque C'est nécessaire pour l'exécution de SomeMethod(), c'est quand il est chargé.

alternativement:

  1. SomeMethod() n'a pas encore couru.
  2. Appelle AppDomain.GetAssemblies (), renvoie un jeu qui n'inclut pas ThirdParty.DLL.
  3. Appel
  4. BuildManager.Getreferencedassembllies (), renvoie un jeu qui inclut ThirdParty.DLL.
  5. Appelle AppDomain.GetAssemblies (), renvoie un jeu qui inclut ThirdParty.DLL.

ici, même si vous n'avez jamais appelé SomeMethod (), l'appel à BuildManager.Getreferencedassembllies () a chargé la bibliothèque tierce dans L'AppDomain courant en votre nom.

bien sûr, tout est sujet à certaines optimisations, etc. mais l' idée générale détient.

54
répondu Levi 2010-03-19 17:43:06