Comment créer un installeur avec Visual Studio 2012 et Wix ?

Comment faisait-on avant ?

Avant la version 2012 de Visual Studio, il n’était pas rare de croiser des projets de déploiement du type « Programme d’installation de Visual Studio ». Evidemment, il existait d’autres alternatives, comme InstallShield qui était proposé nativement.

Visual Studio 2010 programme installation

Le projet d’installation proposé par Visual Studio a le mérite d’être simple et rapide à implémenter mais surtout d’être proposé gratuitement. Ce dernier point est, comme nous pouvons le remarquer au quotidien, un élément fortement apprécié dans la réalisation d’un projet.

Par contre, cette solution a deux énormes inconvénients à l’heure actuelle :

  • Le projet impose d’utiliser Visual Studio pour être compilé (ça fait tâche sur un serveur de build…),
  • Ce type de projet a été tout simplement abandonné à partir de Visual Studio 2012 !

Comment fait-on ? Allez-vous me dire. Il vous reste la solution InstallShield, seule alternative proposée par Visual Studio 2012 :

Visual Studio 2012 configuration et deploiement

Si l’on avait fait le choix d’InstallShield auparavant, aucun problème. Par contre pour l’installeur de Visual Studio : adieu votre beau projet… ou pas !

Le projet Wix

Nous arrivons dans le vif du sujet, il existe bien une alternative à ce vide laissé par la suppression de l’installeur Visual Studio : le projet Wix.

Wix est un projet open source sous licence CPL publié par Microsoft lui-même ! Vous avez bien entendu. Vous avez la possibilité de récupérer le code source sur CodePlex :

http://wix.codeplex.com/SourceControl/latest

Pour utiliser Wix avec Visual Studio 2012 (ou une version antérieure), il vous suffit d’installer la dernière version stable (3.7 au moment où cet article est écrit) à partir du site officielle :

http://wixtoolset.org/releases/

Une fois Wix installé sur votre machine, si l’on retourne sous Visual Studio 2012 on remarque l’apparition d’une nouvelle famille de projets : Windows Installer XML (WIX).

Visual Studio 2012 Wix template project

Lorsque l’on ajoute un « Setup Project » à notre solution, Wix nous crée un fichier « wxs » contenant la définition de notre installeur en XML :

<?xml version="1.0" encoding="UTF-8"?>
 <Wix xmlns="<a href="http://schemas.microsoft.com/wix/2006/wi">http://schemas.microsoft.com/wix/2006/wi</a>">
        <Product Id="*" Name="SetupProjectCellenza2012" Language="1033" Version="1.0.0.0" Manufacturer="" UpgradeCode="1b460ae2-7511-4e98-94b3-b40bd5138e92">
              <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
              <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
              <MediaTemplate />
<Feature Id="ProductFeature" Title="SetupProjectCellenza2012" Level="1">
                     <ComponentGroupRef Id="ProductComponents" />
              </Feature>
        </Product>
<Fragment>
              <Directory Id="TARGETDIR" Name="SourceDir">
                     <Directory Id="ProgramFilesFolder">
                            <Directory Id="INSTALLFOLDER" Name="Cellenza2012" />
                     </Directory>
              </Directory>
        </Fragment>
<Fragment>
              <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
                     <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
                     <!-- <Component Id="ProductComponent"> -->
                            <!-- TODO: Insert files, registry keys, and other resources here. -->
                     <!-- </Component> -->
              </ComponentGroup>
        </Fragment>
 </Wix>

Au premier abord cela peut faire peur, mais on s’y fait très vite. Il faut commencer par renseigner les champs vides tels que « Manufacturer » ou encore l’ID de la balise « Product ».

Pour l’instant notre installeur ne fait que créer des dossiers vides, ce qui n’est pas très intéressant. Ajoutons des fichiers provenant de notre solution. Pour cela il nous faut ajouter une référence vers les projets désirés :

Wix ajouter reference

Une fois la source référencée, il faut déclarer les fichiers que l’on souhaite installer :

<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<Component Id="ProductComponent">
<!--TODO: Insert files, registry keys, and other resources here.-->
<File Source="$(var.HelloCellenza2012.TargetDir)\HelloCellenza2012.exe"/>
</Component>
</ComponentGroup>
</Fragment>

Vous remarquerez l’utilisation de la variable $(var.HelloCellenza2012.TargetDir) qui permet de récupérer directement le dossier de sortie du projet.

Notre installeur est désormais fonctionnel. Néanmoins il reste quelques points à améliorer.

Par défaut, un fichier « cab » est généré mais n’est pas embarqué dans le MSI. Pour corriger cela il vous suffit d’ajouter l’élément « EmbedCab » dans la balise « MediaTemplate » :

<MediaTemplate EmbedCab="yes" />

Ensuite, notre installeur ne possède pas d’interface utilisateur par défaut. Pour cela il suffit d’ajouter les balises suivantes  dans l’élément « Product »:

<UIRef Id="WixUI_InstallDir"/>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />

Où INSTALLFOLDER correspond à l’identifiant du dossier d’installation.

Attention, pour utiliser l’interface graphique vous devez ajouter une référence vers la librairie graphique :

Wix add UI

Au final cela nous donne le fichier WXS suivant :

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
	<Product Id="E69A41DA-A89D-424A-85DA-473CA3AA160F" Name="HelloCellenza2012" Language="1033" Version="1.0.0.0" Manufacturer="Cellenza" UpgradeCode="1b460ae2-7511-4e98-94b3-b40bd5138e92">
		<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
    <MediaTemplate EmbedCab="yes" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of HelloCellenza is already installed." />

		<Feature Id="ProductFeature" Title="SetupProjectCellenza2012" Level="1">
			<ComponentGroupRef Id="ProductComponents" />
		</Feature>
    <UIRef Id="WixUI_InstallDir"/>
    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />

  </Product>

	<Fragment>
		<Directory Id="TARGETDIR" Name="SourceDir">
			<Directory Id="ProgramFilesFolder">
				<Directory Id="INSTALLFOLDER" Name="Cellenza2012" />
			</Directory>
		</Directory>
	</Fragment>

	<Fragment>
		<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
			<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
			 <Component Id="ProductComponent">
				 <!--TODO: Insert files, registry keys, and other resources here.-->
         <File Source="$(var.HelloCellenza2012.TargetDir)\HelloCellenza2012.exe"/>
			 </Component>
		</ComponentGroup>
	</Fragment>
</Wix>

Vous avez la base pour créer votre installeur, vous avez la possibilité de le personnaliser un maximum comme ajouter des raccourcis, des contraintes d’installation, des actions personnalisées (avec pourquoi pas une dll externe), choisir les fenêtres de l’installeur… Bref, la liste est longue et mérite un autre article ;).

Pour finir, contrairement à l’installeur de Visual Studio :

  • Wix est compatible avec Visual Studio 2012 (et versions antérieures)
  • Wix est compilable avec MSBuild

De plus, il existe des plugins sur le marché permettant de migrer votre installeur vdproj vers un projet Wix.

5 Commentaires Laisser un commentaire

Merci pour cet article, je le conseillerais vivement !

Répondre

Merci, très pratique pour débuter sans être rebuté

Répondre

Peut ton partir d’un soft déjà codé pour créer un .msi ?

Répondre
Alexandre Démoulin
Alexandre Démoulin
juin 9, 2016 15:08

Créer un MSI pour un projet Visual Studio existant? oui bien évidemment, il vous faut juste ajouter le projet WIX à votre solution.

Répondre

hello j’ai suivi le tuto a la lettre mais pas moyen de voir apparaitre wix dans microsof visual studio express 2012 ?

Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *