%windir%\Microsoft.NET\assembly\
est le nouveau GAC . Cela signifie-t-il maintenant que nous devons gérer deux GAC, l'un pour les applications .NET 2.0-3.5 et l'autre pour les applications .NET 4.0?
La question est, pourquoi?
%windir%\Microsoft.NET\assembly\
est le nouveau GAC . Cela signifie-t-il maintenant que nous devons gérer deux GAC, l'un pour les applications .NET 2.0-3.5 et l'autre pour les applications .NET 4.0?
La question est, pourquoi?
Réponses:
Oui, car il existe 2 Global Assembly Cache (GAC) distincts, vous devrez gérer chacun d'eux individuellement.
Dans .NET Framework 4.0, le GAC a subi quelques modifications. Le GAC a été divisé en deux, un pour chaque CLR.
La version CLR utilisée pour .NET Framework 2.0 et .NET Framework 3.5 est CLR 2.0. Il n'était pas nécessaire dans les deux versions précédentes du framework de diviser GAC. Le problème de la rupture des anciennes applications dans Net Framework 4.0.
Pour éviter les problèmes entre CLR 2.0 et CLR 4.0, le GAC est désormais divisé en GAC privés pour chaque exécution. La principale modification est que les applications CLR v2.0 ne peuvent plus voir les assemblys CLR v4.0 dans le GAC.
Pourquoi?
Cela semble être dû au fait qu'il y a eu un changement CLR dans .NET 4.0 mais pas dans 2.0 à 3.5. La même chose s'est produite avec 1.1 à 2.0 CLR. Il semble que le GAC ait la capacité de stocker différentes versions d'assemblages tant qu'ils proviennent du même CLR. Ils ne veulent pas casser les anciennes applications.
Consultez les informations suivantes dans MSDN sur les modifications GAC dans 4.0 .
Par exemple, si .NET 1.1 et .NET 2.0 partageaient le même GAC, une application .NET 1.1, chargeant un assembly à partir de ce GAC partagé, pourrait obtenir des assemblys .NET 2.0, cassant ainsi l'application .NET 1.1
La version CLR utilisée pour .NET Framework 2.0 et .NET Framework 3.5 est CLR 2.0. En conséquence, il n'était pas nécessaire dans les deux versions précédentes du framework de diviser le GAC. Le problème de la rupture des anciennes applications (dans ce cas, .NET 2.0) refait surface dans Net Framework 4.0, date à laquelle CLR 4.0 est sorti. Par conséquent, pour éviter les problèmes d'interférence entre CLR 2.0 et CLR 4.0, le GAC est désormais divisé en GAC privés pour chaque exécution.
Comme le CLR est mis à jour dans les futures versions, vous pouvez vous attendre à la même chose. Si seule la langue change, vous pouvez utiliser le même GAC.
Je voulais également savoir pourquoi 2 GAC et j'ai trouvé l' explication suivante de Mark Miller dans la section commentaires de .NET 4.0 a 2 Global Assembly Cache (GAC) :
Mark Miller a dit ... 28 juin 2010 12:13 PM
Merci pour le post. Les «problèmes d'interférence» étaient intentionnellement vagues. Au moment de la rédaction du présent rapport, les problèmes étaient toujours à l'étude, mais il était clair qu'il y avait plusieurs scénarios brisés.
Par exemple, certaines applications utilisent Assemby.LoadWithPartialName pour charger la version la plus élevée d'un assembly. Si la version la plus élevée était compilée avec la v4, une application v2 (3.0 ou 3.5) ne pouvait pas la charger et l'application se bloquait, même s'il existait une version qui aurait fonctionné. À l'origine, nous avons partitionné le GAC sous son emplacement d'origine, mais cela a causé des problèmes avec les scénarios de mise à niveau de Windows. Ces deux impliquaient du code qui avait déjà été livré, nous avons donc déplacé notre (GAC partitionné en version vers un autre endroit.
Cela ne devrait pas avoir d'impact sur la plupart des applications et n'ajoute aucune charge de maintenance. Les deux emplacements doivent uniquement être accessibles ou modifiés à l'aide des API GAC natives, qui traitent le partitionnement comme prévu. Les endroits où cela fait surface sont via des API qui exposent les chemins du GAC tels que GetCachePath, ou examinent le chemin de mscorlib chargé dans le code managé.
Il convient de noter que nous avons modifié les emplacements GAC lorsque nous avons publié la v2 ainsi que lorsque nous avons introduit l'architecture dans le cadre de l'identité de l'assembly. Ceux-ci ont ajouté GAC_MSIL, GAC_32 et GAC_64, bien que tous soient toujours sous% windir% \ assembly. Malheureusement, ce n'était pas une option pour cette version.
J'espère que cela aidera les futurs lecteurs.
Cela n'a pas beaucoup de sens, le GAC d'origine était déjà tout à fait capable de stocker différentes versions d'assemblages. Et il y a peu de raisons de supposer qu'un programme référencera jamais accidentellement le mauvais assemblage, tous les assemblys .NET 4 ont obtenu le [AssemblyVersion] remonté à 4.0.0.0. La nouvelle fonction côte à côte en cours ne devrait pas changer cela.
Ma conjecture: il y avait déjà trop de projets .NET qui ont enfreint la règle "ne jamais rien référencer directement dans le GAC". Je l'ai vu plusieurs fois sur ce site.
Une seule façon d'éviter de casser ces projets: déplacer le GAC. La rétrocompatibilité est sacrée chez Microsoft.
Assembly.LoadWithPartialName
, que se passe-t-il si nous avons 2 versions de l'assemblage sur le GAC?