[Visual Studio] Incrémenter automatiquement le numéro de version d’un assembly à chaque compilation

Une question qui vient de m’être posé sur les forums de Microsoft : « Comment incrémenter automatiquement le n° de version d’un assembly à chaque compilation ? ».

Pour cela 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).

Il faudra ensuite 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). Il est possible de modifier ce fichier via le bloc-notes par exemple, mais il y a une petite astuce pour le faire depuis Visual Studio ! J’en profite donc pour vous l’expliquer :

Sélectionnez votre projet dans l’explorateur de solution et faites un clic droit, sélectionnez l’option : « Déchargez le projet ».

Déchargement d'un projet dans Visual Studio

Déchargement d'un projet dans Visual Studio

Sélectionnez à nouveau votre projet déchargé, faites un clic droit et sélectionnez l’option : « Modifier VotreProjet.csproj ».

Edition d'un fichier projet Visual Studio en XML

Edition d'un fichier projet Visual Studio en XML

A ce moment là, Visual Studio ouvre votre fichier projet dans un éditeur XML, il suffit d’ajouter à la fin de celui-ci les balises suivantes :

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets"/>
  <PropertyGroup>

    <!-- Incrémentation de l'attribut AssemblyVersion -->
    <AssemblyMajorVersion>1</AssemblyMajorVersion>
    <AssemblyMinorVersion>6</AssemblyMinorVersion>
    <AssemblyBuildNumber>64</AssemblyBuildNumber>
    <AssemblyBuildNumberType>NoIncrement</AssemblyBuildNumberType>
    <AssemblyRevisionType>AutoIncrement</AssemblyRevisionType>

    <!-- Incrémentation de l'attribut AssemblyFileVersion -->
    <AssemblyFileMajorVersion>1</AssemblyFileMajorVersion>
    <AssemblyFileMinorVersion>6</AssemblyFileMinorVersion>
    <AssemblyFileBuildNumber>64</AssemblyFileBuildNumber>
    <AssemblyFileBuildNumberType>NoIncrement</AssemblyFileBuildNumberType>
    <AssemblyFileRevisionType>AutoIncrement</AssemblyFileRevisionType>

  </PropertyGroup>
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

Les lignes surlignées en jaune sont à ajouter. Visual Studio risque de souligner l’élément PropertyGroup ou AssemblyMajorVersion comme étant incorrect. Ignorez dans ce cas cette erreur… Une fois chose faites, n’oubliez pas d’enregistrer vos modification et de recharger votre projet en faisant un clic droit sur ce dernier et en sélectionnant l’option : « Recharger MonProjet.csproj ». Durant le rechargement du projet, Visual Studio vous signale que le fichier projet a été modifié et qu’il peut contenir du code malveillant. A moins que vous ne me faites pas confirance, mais choisissez « Chargez normalement le projet » et cliquez sur OK.

Message d'avertissement de Visual Studio lors du rechargement du projet

Message d'avertissement de Visual Studio lors du rechargement du projet

Maintenant place aux explications concernant ce fichier MSBuild modifié :

Tout d’abord il faut différencier les éléments AssemblyXXXXVersion qui permettent de modifier la valeur de l’attribut AssemblyVersion et AssemblyFileXXXXVersion qui permettent de modifier la valeur de l’attribut AssemblyFileVersion.

  • Les éléments AssemblyMajorVersion et AssemblyFileMajorVersion permettent de spécifier le numéro de la version majeur d’un assembly.
  • Les éléments AssemblyMinorVersion et AssemblyFileMinorVersion permettent de spécifier le numéro de la version mineur d’un assembly.

Les éléments commençant par AssemblyBuildXXXXX et AssemblyRevisionXXXX permettent de modifier respectivement le numéro de version du « Build » et de la « Revision« . Ces dernières disposent de 3 propriétés permettant d’indiquer comment s’incrémente ces numéros. Si on prend par exemple les propriétés manipulant le n° de « Build« , trouve les propriétés suivantes :

  • AssemblyBuildNumberType : Le type d’incrémentation à réaliser. Les valeurs possibles sont les suivantes :
    • NoIncrement : Pas d’incrémentation dans ce cas il faut spécifier explicitement le numéro de « Build » via la propriété AssemblyBuildNumber.
    • AutoIncrement : Incrémentation de 1 du numéro de « Build » à chaque compilation.
    • DateString : Spécifie la date courante comme n° de version. (Un formatage peut-être précisé via la propriété AssemblyBuildNumberFormat).
  • AssemblyBuildNumber : Spécifiez cette valeur si vous avez indiqué précédemment l’option NoIncrement.
  • AssemblyBuildNumberFormat : Format de la date à utiliser si vous avez indiqué précédemment l’option DateString.

Ces propriétés ont un fonctionnement indentique pour la gestion du numéro de « Revision » et pour la gestion de l’attribut AssemblyFileVersion.

NOTE :

  • Avant de lancer la première compilation, soyez sur que le fichier AssemblyInfo existe bien dans votre projet et que celui-ci contient les balises AssemblyVersion et AssemblyFileVersion.
  • Si vous ne modifiez aucun fichier dans votre projet, bien évidement aucune compilation n’est réalisée et donc AssemblyInfoTask ne sera pas executé.
  • AssemblyInfoTask peut être utilisé par Team Build.
  • AssemblyInfoTask doit être installé sur la machine qui executera la compilation de votre projet.
  • AssemblyInfoTask permet aussi de manipuler d’autres attributs présent dans le fichier AssemblyInfo, n’hésitez pas à regarder la documentation au format .chm présent dans l’archive téléchargée.

Téléchargez AssemblyInfoTask depuis le site officiel de Microsoft Code Gallery