Quels sont les avantages et les inconvénients de l'utilisation du CAG?

et en plus de cela, y a-t-il des cas où l'on doit utiliser le cache global assembly ou où l'on ne peut pas l'utiliser?

50
demandé sur splattne 2008-08-23 01:41:58

8 réponses

  • les assemblages de chargement de GAC signifient moins de frais généraux et de sécurité que votre application chargera toujours la version correcte de .net library
  • vous ne devriez pas ngen assemblages qui sont à l'extérieur de GAC, parce qu'il n'y aura presque aucun gain de performance, dans de nombreux cas même une perte de performance.
  • vous utilisez déjà GAC, car tous les assemblages standard .NET sont en fait en GAC et ngened (lors de l'installation).
  • Utiliser GAC pour vos propres bibliothèques ajoute de la complexité au déploiement, j'essaierais de l'éviter à tout prix.
  • vos utilisateurs ont besoin d'être connectés en tant qu'administrateurs pendant l'installation si vous voulez mettre quelque chose dans GAC, tout un problème pour de nombreux types d'applications.

donc, pour résumer tout cela, commencez simple et si vous voyez plus tard des gains de performance majeurs si vous mettez vos assemblages dans GAC et NGEN eux, allez-y, sinon ne vous en souciez pas. GAC est plus adapté pour les cadres où il ya attente pour la bibliothèque d'être partagée entre plus d'applications, dans 99% des cas, vous n'avez pas besoin.

45
répondu lubos hasko 2008-08-22 22:22:08

avantage:

  • un seul endroit pour mettre à jour vos assemblages
  • vous utilisez un peu moins d'espace disque dur

désavantage:

  • si vous devez mettre à jour un seul site web, vous ne pouvez pas. Vous pouvez finir avec les autres sites Web dans le serveur web cassé

recommandation: laisser le GAC à MS et à ses amis. La gigabyte est très bon marché maintenant.

20
répondu Eduardo Molteni 2008-08-22 23:08:10

le GAC peut également être utilisé par des assemblages qui nécessitent des permissions élevées pour effectuer des opérations privilégiées pour le compte de codes de confiance moins élevés (par exemple une fiducie partielle ASP.NET application).

par exemple, dites que vous avez une fiducie partielle ASP.NET application qui doit effectuer une tâche qui nécessiterait des privilèges élevés, c.-à-d. pleine confiance . La solution est de mettre le code qui nécessite des privilèges élevés dans un assemblage séparé. Le l'assemblée est marquée de l'attribut AllowPartiallyTrustedCallers et la classe qui contient la logique privilégiée est marquée de L'attribut PermissionSet, quelque chose comme ceci:

[PermissionSet(SecurityAction.Assert, Unrestricted=true)]

notre assemblée aurait reçu un nom fort (signé) et serait ensuite déployée dans le GAC.

maintenant notre(s) application (s) partiellement fiable (s) peut utiliser l'assemblage fiable dans le GAC pour effectuer un ensemble spécifique et étroit d'opérations privilégiées sans perdre les avantages de partiels confiance.

18
répondu Kev 2014-11-12 14:43:14

lorsque j'ai fait moi-même des recherches sur ce sujet, j'ai découvert que Démystifiait le .net Global Assembly Cache par Jeremiah Talkar m'a beaucoup aidé.

10
répondu Espo 2012-11-13 07:44:48

si vous expédiez une bibliothèque réutilisable composée de plusieurs assemblages, mais que peu d'entre eux forment une façade, vous pouvez envisager d'installer les assemblages dans GAC, si le paquet est installé sur les PC du développeur.

imaginez, vous expédiez 6 assemblages, et un seul de ces 6 assemblages contient une façade - i.e. les 5 autres ne sont utilisés que par la façade elle-même. Vous expédiez:

  • Myproduit.Façade.dll - c'est la seul composant destiné à être utilisé par les développeurs
  • MyProduct.Core.dll-utilisé par MyProduct.Façade.dll, mais non destiné à être utilisé par les développeurs
  • MyProduct.Component1.dll - la même
  • MyProduct.Component2.dll - la même
  • troisième partie.Lib1.dll-bibliothèque de tiers utilisée par MyProduct.Component1.dll
  • troisième partie.Lib2.dll - la même
  • etc.

les développeurs qui utilisent votre projet aimeraient juste faire référence à MyProduct.Façade.dll dans leurs propres projets. Mais quand leur projet court, il doit être capable de charger tous les assemblages auxquels il fait référence - de façon récursive. Comment cela peut être réalisé? En général, ils doivent être disponibles soit dans le dossier Bin, soit dans GAC:

  • vous pouvez demander aux développeurs de localiser votre dossier d'installation et ajouter des références à tous les assemblages que vous avez mis là. Cela permettra de s'assurer qu'ils seront copiés dans le dossier Bin pour être disponibles en exécution.
  • vous pouvez installer VS.NET modèle de projet contenant déjà ces 6 références . Un peu complexe, puisque vous devriez injecter le chemin réel à vos assemblages dans ce modèle avant son installation. Ceci ne peut être fait que par l'installateur, puisque ce chemin dépend de l'installation chemin.
  • vous pouvez demander aux développeurs de créer une étape spéciale de post-construction .csproj/.fichier vbproj copie des dépendances nécessaires dans le dossier Bin. Les mêmes inconvénients.
  • enfin, vous pouvez installer tous vos assemblages dans GAC . Dans ce cas, les développeurs doivent ajouter la référence à MyProduct.Façade.dll à partir de leur projet. Tout le reste sera disponible à l'exécution de toute façon.

Note: la dernière option Ne vous oblige pas à faire la même chose lors de l'expédition du projet aux PC de production. Vous pouvez soit expédier tous les assemblages dans le dossier Bin, soit les installer dans GAC - tout dépend de votre souhait.

ainsi la solution décrite montre l'avantage de mettre des assemblages tiers dans GAC pendant le développement. Il n'a pas liées à la production.

comme vous pouvez le constater, l'installation dans GAC est principalement destiné à résoudre le problème de l'emplacement des assemblys requis (dépendances). Si un assemblage est installé dans GAC, vous pouvez considérer qu'il existe "à proximité" de n'importe quelle application. C'est comme l'ajout de chemin .exe à votre variable PATH, mais dans "managed way". - bien sûr, il s'agit d'une description plutôt simplifiée;)

7
répondu Alex Yakunin 2009-06-21 16:48:58

je pense que l'un des plus grands avantages de l'utilisation du GAC est que vous pouvez avoir plusieurs versions de la même assemblée enregistrées et disponibles pour vos applications. Personnellement, je n'aime pas comment il restreint le mouvement d'une machine à une autre (je n'aime pas avoir à dire, vérifier la source sur un nouveau VPC et passer par un tas d'étapes pour le faire fonctionner parce que je dois enregistrer des choses dans le GAC)

6
répondu jonezy 2008-08-22 21:44:14

le GAC fonctionne en toute confiance et peut être utilisé par des applications en dehors de votre application Web. Par exemple, les emplois de minuterie dans Sharepoint doivent être dans le GAC parce que le service sptimer est un processus séparé.

la partie "pleine confiance" est aussi une source possible de problèmes de sécurité. Bien sûr, vous pouvez travailler avec la sécurité D'accès au Code, mais je ne vois pas trop D'assemblages utilisant CAS malheureusement :( le dossier /bin peut être verrouillé sur le Support ce qui est normalement très bien.

Daniel Larson a un post sur CAS ainsi qui détaille les différences un peu plus.

6
répondu Michael Stum 2008-08-22 21:50:58

dans toute ma vie, j'ai peut-être eu une application où j'ai dû mettre une assemblée dans le GAC, tout simplement parce que ces assemblées faisaient partie d'un cadre qu'un certain nombre d'applications l'utiliseraient, et il semblait juste de les mettre dans le GAC.

3
répondu Vaibhav 2008-08-22 21:44:06