Renaud Dumont

Somehow Developer @ Sparkle / NTWRK

Developer, author, networker. I blog (mainly in French) about technology. I organize events for developers in Belgium.


Déployer un plugin VSTO avec InstallShield LE

Je pensais que c'était trivial de créer un installateur, jusqu'à ce que j'aie à le faire pour la première fois avec InstallShield LE. Comme la doc laisse à désirer, j'écris ceci en guise de note pour moi-même.


InstallShield LE

D'abord, il faut savoir qu'il n'y a pas de système de base dans Visual Studio 2013 (ni 2012) pour faire un simple installateur. Ca semble pourtant être la base... pouvoir installer une programme, le mettre à jour de manière professionnelle, avec une mention dans le menu d'ajout/suppression de programme. C'est ce à quoi s'attend tout utilisateur sur Windows.

Il y a bien l'option ClickOnce, mais elle fait un peu cheap (même si dans le fond c'est assez pratique avec le déploiement de mise à jour online).

On retrouve toutefois quelques inconvénients dans le cas de l'utilisation pour un VSTO :

  • A moins d'acheter un certificat de code-signing, un utilisateur lambda devra confirmer plusieurs fois qu'il veut installer une application provenant d'une source non trustée (et donc potentiellement dangereuse).
  • Impossible de faire une installation ClickOnce si les fichiers à installés sont stockés sur un serveur sans certificat SSL, à moins que le site soit dans la Trusted Zone. Ce que personne ne fait.

Bref, InstallShield va permettre de faire un installateur classique, en évitant ces problèmes.

A la première création d'un projet InstallShield, vous serez invité à télécharger et installer la version LE (Limited Edition for Visual Studio).

Nouveau projet InstallShield LE

Et là, l'enfer commence :-)

Configuration de base

Imaginons que je veuille créer un installateur pour un plugin Word... Je vais simplement commencer par ajouter un projet InstallShield à ma solution existante.

Assistant de configuration InstallShield LE

Un superbe assistant propose alors de vous guider à travers les différentes étapes de la configuration.

Mais passons directement aux parties clés.

En restant dans la page de l'assistant :

  1. Application information

    La première fenêtre parle d'elle-même. Il suffit de compléter le nom de votre société, de votre application, son numéro de version et le site web de l'entreprise.

    Ce n'est pas vraiment critique pour l'installation, mais les paramètres comme le nom de votre société et de l'application peuvent être utilisés pour déterminés le dossier d'installation.

  2. Application Files

    On passe directement à l'étape 4 de l'assistant. Ici, on est supposé fournir les fichiers nécessaires au bon fonctionnement du programme. Dans le cas d'un plugin VSTO, il faut dans un premier temps ajouter le Primary Output. Pour cela, cliquez sur Add Project Outputs comme sur l'exemple ci-dessous, et sélectionnez Primary Output.

    Add project outputs

    Il faut également ajouter deux fichiers que vous devez aller directement chercher dans votre dossier de release (pensez à faire un premier build en release pour être sûr que ces fichiers existentes ;)). Ajoutez donc VotreAddin.dll.manifest et VotreAddin.vsto :

    Fichiers supplémentaires à ajouter dans l'installateur

  3. Application Registry

    Finalement, on va se permettre d'écrire une clé de registrer pour faciliter l'installation de notre plugin.

    En effet, pour enregistrer un plugin, il faut normalement exécuter le fichier .vsto. Le problème, c'est que cela demande d'avoir du code trusté avec un certificat de code-signing, ce qui coûte relativement cher.

    Ce qu'on va faire à la place, c'est ajouter une clé de registre afin de prévenir Word à son lancement qu'un nouveau plugin est disponible (même s'il n'a pas été enregistré normalement), et on va lui renseigner son emplacement.

    Allez sur HKEY_CURRENT_USER et ajoutez les clés suivantes :

    HKEY_CURRENT_USER / Software / Microsoft / Office / Word(*) / Addins / YourAddin

    (*) évidemment, si vous faites un plugin Powerpoint ou autre, il suffit de remplacer par le programme approprié ;-)

    Enfin, ajoutez les 4 valeurs suivantes :

    • String Description : Votre description
    • String FriendlyName : Votre plugin
    • String Manifest : le chemin vers le fichier .vsto. [INSTALLDIR] représente le dossier courrant d'installation. Votre valeur devrait ressembler à file:///[INSTALLDIR]VotreAddin.vsto|vstolocal
    • DWORD LoadBehavior : 3

    Le LoadBehavior a 3 indique que le plugin doit être chargé au démarrage de l'application (Word dans ce cas-ci).

    Clés de registres à créer

    Pour plus d'infos sur ces clés de registres, vous pouvez consulter la doc MSDN : Registry Entries for Application-Level Add-Ins.

  4. Specify Application Data / Redistributables

    On va maintenant sortir de l'assistant pour ajouter quelques finitions. Dans l'explorateur de solution, cherchez l'étape 2. Specify Application Data, et allez dans la rubrique Redistributables.

    Ici, vous allez devoir cocher deux choses :

    • votre version de .NET. Dans mon cas, pour un projet développé avec Visual Studio 2013 et .NET 4.5, je vais cocher Microsoft .NET Framework 4.5 Full
    • les dépendances nécessaires pour les VSTO : Visual Studio 2010 Tools for Office Runtime.

    Avec cela, vous devriez pouvoir déployer votre solution aussi bien sur Windows 7 que Windows 8, avec Office 2010 ou 2013.

  5. Installez !

    Et voilà ! On est bon pour installer notre première version du plugin.

    Vous pouvez encore aller faire un tour dans la partie Installation Interview si vous souhaitez modifier les différentes fenêtres qui apparaissent durant l'installation (End User License Agreement, demander à l'utilisateur son nom et celui de sa société, etc...).

    Pour obtenir votre installateur, il ne vous reste plus qu'à builder le projet InstallShield, et à récupérer l'éxécutable dans un sous-dossier du projet InstallShield : Visual Studio 2013 / Projects / WordAddIn1 / WordAddinInstaller / WordAddinInstaller / Express / SingleImage / DiskImages / DISK1 / setup.exe

Programme multi-lingue

Si votre plugin fait intervenir des ressources multilingues .resx, il vous faudra également les embarquer dans l'installateur.

Pour cela, il suffit de rajouter les ressources de localisées aux fichiers compris dans l'installation. Sans quoi vous n'aurez que les ressources de votre langue par défaut.

Pour ce faire, allez à l'étape 2 du projet InstallShield, Specify Application Data > Files.

Ajout de ressources localisées

La partie du haut vous permet de sélectionner du contenu à ajouter à l'installation. La partie du bas indique ce qui est inclu dans votre installateur actuellement.

Notez tout de même que le Localized Resources From YourProject n'apparaît que lorsque vous avez effectivement au moins un fichier de ressources localisées !

Mise à jour

Dans cette partie, nous allons voir comment configurer l'installateur pour qu'il supprime les versions précédentes de votre plugin avant d'en réinstaller une nouvelle.

Rendez-vous dans à l'étape 1 du projet InstallShield, Organize Your Setup > General Information.

Version, Product Code et Upgrade Code

Trois valeurs nous intéressent ici :

  • Product Version : le numéro de version de votre logiciel. Ce numéro n'est pas lié à la version que vous déclarez dans les propriétés de votre projet. Mais c'est le numéro qui apparaîtra dans la vue Programmes & fonctionnalités qui permet à l'utilisateur de désinstaller des programmes.
  • Product Code : ce numéro identifie de manière unique une version de votre application. Chaque release de votre projet doit avoir un numéro de produit différent pour pouvoir faire fonctionner les mises à jour.
  • Upgrade Code : ce numéro indique que différentes versions font partie d'une même famille de produits et qu'il doit y avoir un processus de mise à jour. Vous ne devez pas modifier ce code si vous voulez permettre la mise à jour.

Pour que vous compreniez bien le rôle du Product Code et de l'Upgrade Code, voici les différents scénarios possible lorsque vous voulez installer une nouvelle version d'un produit :

  • Product Code et Upgrage Code inchangés :

    L'installation échoue. Un message d'erreur averti l'utilisateur qu'une autre version de ce produit existe déjà et qu'il faut d'abord la désinstaller (manuellement) avant de pouvoir installer celle-ci.

  • Product Code inchangé, Upgrade Code différent :

    L'installation se fait sans problème, mais Windows pense avoir affaire à deux familles de produits différents. On se retrouve donc avec deux installations visibles dans le menu Programmes & fonctionnalités.

  • Product Code modifié, Upgrade Code inchangé :

    Dans ce cas-ci, tout se passe correctement. Grâce à l'Upgrade Code, Windows reconnait qu'une autre version de l'application existe déjà et la désinstalle pour la remplacer par la nouvelle.

Icône dans le menu Ajout/Suppression de programmes

Enfin, pour que le menu Programme & fonctionnalités vous affiche une belle icône, et pas celle d'InstallShield par défaut, vous pouvez modifier la source dans la partie Organize Your Setup > General Information.

Source de l'icône

Il faut fournir un fichier au format .ico, et si vous en avez un dans votre solution, vous pouvez y faire référence avec le raccourci <VSSolutionFolder>\YourProject\Icon.ico

Au passage, si vous cherchez un moyen simple de convertir une image en icône, vous trouverez plein de site web qui font ça pour vous. Celui-ci fonctionne : http://iconverticons.com/online/.


And that's it :-) Il reste encore pas mal d'options un peu partout : les scripts automatiques, l'écriture de clé de registres, etc... mais je vous laisse le plaisir de le découvrir par vous-même !

comments powered by Disqus