A quoi sert les versions dans les assemblys ?

MSDN

  • Assembly, classe : Représente un assembly, qui est un bloc de construction réutilisable, avec un numéro de version et autodescriptif d'une application du Common Language Runtime
  • AssemblyName.Version, propriété : Obtient ou définit les numéros principal, secondaire, de build et de révision de l'assembly.
  • AssemblyFileVersionAttribute, classe : Ordonne à un compilateur d'utiliser un numéro de version déterminé pour la ressource de la version du fichier Win32. La version du fichier Win32 ne doit pas nécessairement être identique au numéro de version de l'assembly.
  • AssemblyVersionAttribute, classe : Spécifie la version de l'assembly avec attributs.
  • Version, classe : Représente le numéro de version d'un assembly du Common Language Runtime.
  • Programmation à l'aide d'assemblys

Comment numéroter ses versions ?

Versioning des assemblys
<version principale>.<version secondaire>.<numéro de build>.<numéro de révision>
Par exemple, la version 1.5.1254.0 indique que 1 est la version principale, 5 la version secondaire, 1254 le numéro de build et 0 le numéro de révision.

Un numéro de version se divise en 4 parties (de gauche à droite)

  • major
  • minor
  • build
  • revision

la règle ( en général ) est la suivante :

  1. on ne change le major et/ou minor que dans le cas où la nouvelle version est incompatible avec la précédente
  2. on change le build lors de modifications compatibles avec la version précédente mais apportant des fonctionnalités nouvelles
  3. on change le revision lors d'une recompilation après des modifications peu importantes ( amélioration d'interfaces ou correction de bugs mineurs sur des fonctionnalités peu utilisées )

On considère que 2 versions sont identiques si le build est le même. C'est la règle utilisée par Microsoft pour l'ensemble de ses logiciels.

La classe Version

Les numéros de version comportent de deux à quatre composants : principal, secondaire, build et révision. Les composants principal et secondaire sont obligatoires ; les composants build et révision sont facultatifs, mais le composant build est obligatoire si le composant révision est défini. Tous les composants définis doivent être des entiers supérieurs ou égaux à 0. Le format du numéro de version est le suivant. Les composants facultatifs sont affichés entre crochets ("[" et "]") :

major.minor[.build[.revision]]

Les composants sont utilisés par convention de la façon suivante :

  • Major : les assemblys portant le même nom, mais ayant des versions principales différentes, ne sont pas interchangeables. Ceci s'applique par exemple dans le cadre d'une réécriture importante d'un produit dont la compatibilité descendante ne peut pas être assurée.
  • Minor : si le nom et le numéro principal de deux assemblys sont identiques, mais que le numéro secondaire est différent, cela indique une amélioration significative avec intention de conserver une compatibilité descendante. Ceci s'applique par exemple dans le cadre d'une version ponctuelle d'un produit ou d'une nouvelle version d'un produit dont la compatibilité descendante est totale.
  • Build : une différence dans le numéro de build représente une recompilation de la même source. Ceci s'applique par exemple dans le cadre d'un changement de processeur, de plateforme ou de compilateur.
  • Revision : les assemblys portant le même nom et les mêmes numéros de versions principale et secondaire, mais ayant des révisions différentes sont destinés à être totalement interchangeables. Ceci s'applique par exemple dans le cadre de la réparation d'une brèche dans la sécurité d'une version précédente d'un assembly.

Les versions suivantes d'un assembly, lorsqu'elles ne diffèrent que par les numéros de build ou de révision, sont considérées comme des mises à jour correctives de la version précédente.

Auto incrémenter automatiquement le numéro de version d'un assembly à chaque compilation

.NET / Visual Studio / VS2005/2008 Incrémenter automatiquement le numéro de version d'un assembly à chaque compilation

Il faut télécharger AssemblyInfoTask qui est un module (plus exactement une tâche) à utiliser par le MSBuild (le gestionnaire de compilation appellé par Visual Studio). Une fois que celui-ci est téléchargé, il suffit de l'installer (je vous recommande de l'installer dans le GAC).

Ensuite if faut modifier le fichier de déclaration MSBuild de votre projet (qui est en fait votre fichier projet .csproj pour les applications C#, .vbproj pour les applications Visual Basic) en y rajoutant dans la section </Project>

<Import Project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets"/>
Problème avec SVN

Lorsque vous compiler avec des votre projet sur SVN vous aurez le problème suivant :

Erreur : Unable to update the AssemblyFileVersion for Properties\.svn\text-base\AssemblyInfo.cs.svn-base: No stub entry for AssemblyFileVersion was found in the AssemblyInfo file.

Vous devrez donc reconfigurer des fichiers tel que l'explique AssemblyInfoTask usage w/ Subversion problem

Editez votre fichier $(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets (C:\Program Files (x86)\MSBuild\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.targets).

<!-- The items that get processed by the task -->
  <ItemGroup>
    <AssemblyInfoFiles Include="**\AssemblyInfo.*"/>
  </ItemGroup>

Et redéfinissez la section itemgroup afin d'exclure tous les dossiers .svn comme ceci :

<!-- The items that get processed by the task -->
  <ItemGroup>
    <!--<AssemblyInfoFiles Include="**\AssemblyInfo.*"/>-->
    <AseemblyInfoFiles
                        Include="**\*.cs"
                        Exclude="**\_svn\**\*.*"/>
 
    <DefaultExclude Include="**\.svn\**" />
    <AssemblyInfoFiles Include="**\AssemblyInfo.*" Exclude="@(DefaultExclude)"/>
  </ItemGroup>

Autres ressources sur l'incrémentation automatique de la version

Basé sur la tache AssemblyInfoTask et sa cible associée Microsoft.VersionNumber.Targets

La tache AssemblyInfoTask est désormais maintenu dans dans le MSBuild Extension Pack.

Alternative

Obtenir la date de dernière compilation avec un AssemblyVersion dynamique

Voyez le post

Dans votre Properties/AssemblyInfo.cs, remplacer

[assembly: AssemblyVersion("1.0.0.0")]

par

[assembly: AssemblyVersion("1.0.*.*")]

Visual studio génère automatiquement une valeur qui est le relative au premier janvier 2000.

Il suffit d'utiliser le code suivant pour obtenir la date de compilation :

private DateTime DateCompiled()
{
 
 // Assumes that in AssemblyInfo.cs,
 // the version is specified as 1.0.* or the like,
 // with only 2 numbers specified;
 // the next two are generated from the date.
 // This routine decodes them.
 
 System.Version v = System.Reflection.Assembly.GetExecutingAssembly(). GetName().Version;
 
 // v.Build is days since Jan. 1, 2000
 // v.Revision*2 is seconds since local midnight
 // (NEVER daylight saving time)
 
 DateTime t = new DateTime(
                                          v.Build * TimeSpan.TicksPerDay +
                                          v.Revision * TimeSpan.TicksPerSecond * 2
                                         ).AddYears(1999);
 
 return t;
}
//[assembly: AssemblyVersion("2.0.11.0")]
//[assembly: AssemblyFileVersion("2.0.0.0")]
//
//[assembly: AssemblyVersion("0.9.0.0")]
//[assembly: AssemblyVersion("1.0.*")]
//
//[assembly: AssemblyVersion("2.0.11.0")]
//[assembly: AssemblyFileVersion("2.0.0.0")]