Gestion des versions des assemblies du GAC par ASP.NET

Le GAC nous permet de partager des assemblies entre plusieurs applications ASP.NET. La gestion des versions des ces assemblies en est aussi facilitée à condition de bien comprendre la différence entre Assembly version et File version.

Allez hop... Petite explication !

 

Lors de la mise à jour d’une assembly nous avons le choix entre changer l’Assembly version et la File version

ProprieteProjet Versions

 

Pour illustrer les deux possibilités, prenons l’exemple de plusieurs sites Web utilisant une même assembly dans le GAC (Assembly V1.0.0.0 / File V1.0.0.0). Les Web.config des applications ASP.NET utilisent :

Assemblies

 

Possibilité 1 : Modification mineure = Correctif

Nous mettons à jour cette assembly dans la GAC en gardant la même Assembly version mais en changeant la File version (Assembly V1.0.0.0 / File V1.1.0.0)

  • Dans la GAC, nous avons maintenant seulement la nouvelle assembly (Assembly V1.0.0.0 / File V1.1.0.0). Cette nouvelle assembly remplace la précédente car nous avons la même Assembly version. En effet, dans la GAC, deux assemblies du même nom ne peuvent pas avoir la même Assembly version
  • Les applications en cours d’exécution utilisent toujours la version précédente (Assembly V1.0.0.0 / File V1.0.0.0) car pour elles rien ne leur indique un changement (le web.config n’a pas changé)
  • Si l’appDomain redémarre : c'est-à-dire si l’application Web redémarre suite à une modification du Web.config par exemple, la nouvelle version n’est toujours pas chargée car l’ancienne est en mémoire dans le processus W3WP.EXE qui n’a pas redémarré
  • Si le processus W3WP.EXE redémarre suite à un recyclage, un crash, alors la CLR va chercher dans le GAC la dll et prend la nouvelle version

 

Possibilité 2 : Modification majeure = Nouvelle version

Nous mettons à jour cette assembly dans la GAC en changeant le numéro de l’Assembly version (Assembly V2.0.0.0)

  • Dans la GAC, nous voyons maintenant les deux assemblies

GAC

  • Les applications en cours d’exécution utiliseront toujours l’Assembly version 1.0.0.0 tant que le web.config n’est pas modifié pour mentionner le changement de version :

AssemblyVersion

  • Comme modifions le Web.config, l’appDomain redémarre (sans redémarrage du processus W3WP.EXE) et prend en charge la nouvelle version

 

Conclusion en images :-)

Changement File version
Redémarrage W3WP.EXE Prise en compte de la nouvelle version
Modification Web.config Aucun changement
Changement Assembly version
Redémarrage W3WP.EXE Aucun changement
Modification Web.config Prise en compte de la nouvelle version

 

J’espère que ces éclaircissements vous aideront dans vos déploiements en production. A bientôt,

Sebastien.