1. Objectif du tutoriel▲
L'objectif de ce tutoriel est d'apprendre à créer un Setup (installeur) de projet Visual Studio avec l’extension gratuite Visual Studio Installer Projects.
1-1. Pourquoi ce tutoriel▲
On trouve de la documentation sur Visual Studio Installer Projects, mais elle concerne souvent des versions plus anciennes assez différentes, essentiellement en anglais. À la création du Setup, quelques points sont un peu déconcertants et pas totalement intuitifs.
1-2. Public ciblé▲
La cible de ce tutoriel est débutant(e).
1-3. Parti-pris▲
- ne sauter aucune étape, quitte à agacer un peu le lecteur expérimenté avec des choses totalement évidentes pour lui ;
- ne pas vouloir être exhaustif ;
- ne donner qu’un cheminement (parmi d’autres) pour aboutir.
Dans ce tutoriel des mots comme « solution » « générer » sont employés ; ils ont dans la terminologie Microsoft, un sens particulier. Leur signification est précisée en fin de tutoriel.
Le vocabulaire (terminologie) MicrosoftVocabulaire (terminologie) Microsoft
1-4. Prérequis▲
Visual Studio installé sur le PC. La version gratuite « Community » est amplement suffisante. De préférence avoir un minimum de pratique des principales commandes et de l’interface utilisateur.
Visual Studio Community 2017 a été utilisé pour ce tutoriel.
2. Le programme pour lequel on va créer un installeur▲
C’est un utilitaire informatique, Open source en C#, « Path Length Checker » écrit par Daniel Schroeder en c# WPF. Il est disponible sur GitHub. Il permet de lister les chemins de fichiers et répertoires dont la longueur est supérieure à une valeur choisie.
Intérêt : avec des chemins d'accès supérieurs à la valeur que gère Windows (1) (2), il y a des problèmes assez sournois et déconcertants : par exemple une sauvegarde qui échoue, ou, dans l’explorateur de fichiers, la taille d’un répertoire qui peut être fausse (inférieure à celle d’un sous-répertoire qu’il contient !).
- Disons moins de 255 caractères. Dans les faits, c’est un peu plus compliqué. Pour les perfectionnistes, des informations supplémentaires sont disponibles sur la toile. En se limitant à des chemins d'accès complets de 240 caractères ça passera à tous les coups.
- Les chemins d'accès trop longs viennent souvent d’un fichier téléchargé « dézippé » dans un répertoire déjà profond.
2-1. Pourquoi avoir choisi ce programme▲
Il est assez caractéristique d’un certain nombre de solutions (cf.Vocabulaire (Terminologie) Microsoft)Vocabulaire (terminologie) Microsoft qu’un débutant utilisera. Il se compose d’un projet console, d’un projet GUI qui le pilote et de packages NuGet. Par ailleurs, en plus d’apprendre à créer un installeur (Setup), cette solution permettra de disposer d’un utilitaire très intéressant.
2-2. A quoi il ressemble▲
3. Préparation de Visual Studio pour pouvoir créer un Setup▲
3-1. Visual Studio Installer Projects▲
Visual Studio installer Projects, lors de l’installation, modifie trois emplacements principaux sur le PC cible :
- le répertoire des programmes ;
- le bureau ;
- le menu démarrer.
Ces trois emplacements sont symbolisés par trois répertoires (folders) :
- application Folder ;
- user’s Desktop ;
- user’s Programs Menu.
Au fur et à mesure de la création du Setup, ces dossiers seront garnis automatiquement ou manuellement avec les éléments nécessaires.
3-2. Installation de l’extension « Microsoft Visual Studio Installer Projects »▲
C’est cette extension qui permettra de générer le Setup (cf. si nécessaire significationVocabulaire (terminologie) Microsoft).
Pour éviter de parcourir toutes les extensions, saisir dans la zone de recherche en haut à droite : Microsoft Visual Studio Installer
Comme pour moi l’extension est installée, elle est cochée, sinon il y aurait un bouton « Télécharger ».
Après avoir cliqué sur « télécharger », l’extension sera disponible au prochain lancement de Visual Studio.
Pour la présente « solution » - au sens « projet » dans Visual Studio-, mais aussi pour toutes les autres.
3-3. Téléchargement des sources du programme à installer▲
Le premier zip contient les exécutables (on n’en a pas forcément besoin, puisqu’on va les recréer).
Le deuxième zip c’est, comme indiqué, les sources.
3-4. Chargement des sources (la solution) dans Visual Studio▲
On dé-zippe le fichier des sources dans un répertoire de son choix, pour les projets c#.
Puis on double clique sur le fichier PathLengthChecker.sln (ou depuis Visual Studio Fichier-> Ouvrir -> Fichier/solution → PathLengthChecker.sln.
Dans l’explorateur de solutions, on a maintenant :
3-5. Construction de la solution▲
Pour s’assurer qu’il n’y a pas d’erreurs.
Pour générer les projets nécessaires (console et GUI), vérifier qu’ils sont cochés dans le gestionnaire de configuration.
Si tout s’est bien passé, il y a un message de succès (et en général quelques avertissements plus ou moins clairs…).
Générer la Solution pour compiler uniquement les fichiers de projet et les composants qui ont été modifiés depuis la dernière génération.
Régénérer la Solution pour générer tous les fichiers projet et les composants.
4. On crée maintenant le projet Setup proprement dit▲
Il y a de très nombreuses possibilités pour créer un Setup. J’ai utilisé Visual Studio Installer Projects parce que c’est une extension gratuite pour Visual Studio, simple à utiliser et qui installe d’une façon classique dans le répertoire Programmes ou programmes(X86) (contrairement à ClickOnceClickOnce).
Programmes (x86) c’est la nouvelle désignation du répertoire Program Files (x86) dans l’explorateur de fichiers de Windows version française.
4-1. Création du projet SetUp▲
4-1-1. Lancement du Setup Wizard▲
Dans l’explorateur de solutions : clic droit sur la solution → « ajouter un nouveau projet »
L’exécutable de ce projet sera le Setup.
Pour cela, avec Visual Studio Installer Projects, il y a deux possibilités :
- créer un projet Visual Studio Installer Projects et le compléter à la main ;
- créer un projet Visual Studio Installer Projects avec un Wizard.
La première fois il est préférable d’utiliser le Setup Wizard. C’est ce que nous allons faire.
Après avoir cliqué sur « Setup Wizard » suivre les étapes ci-dessous :
4-1-2. Sélection de ce qui doit être installé▲
Ici il y a deux projets, un en mode console qui cherche les répertoires et un GUI (interface graphique) qui facilite l’utilisation du premier.
Il faut donc sélectionner la sortie principale des deux projets (console et GUI) qui est PathLengthChecker.exe et PathLengthCheckerGUI.exe.
On clique sur suivant :
Laisser vide ou ajouter par exemple des fichiers comme :
- readmefirst.txt ;
- licence.txt ; fichier d’aide.chm.
Pour ajouter des fichiers divers on peut utiliser « Choose files to include » mais aussi clic droit sur le répertoire → Add → Files.
Le wizard est fini, cliquer sur « terminer ».
Le projet de Setup est créé.
4-1-3. A quoi ressemble le projet Setup▲
4-2. Personnalisation et completion du setup▲
4-2-1. Nom de l’entreprise, Nom de l’auteur, nom de l’application etc.▲
Après un clic droit sur le projet Setup, on indique le nom de l’auteur, de la société, la version etc. dans les propriétés.
4-2-2. Les icônes de raccourci sur le bureau et l’entrée du menu démarrer▲
Cette étape n’est pas totalement intuitive la première fois.
On pourrait penser qu’il suffit d’affecter une icône à l’application dans le projet à déployer, comme on le fait habituellement :
C’est nécessaire, mais pas suffisant. Les développeurs de Visual Studio Installer Projects ne récupèrent pas cette icône ! Et si on en reste là, c’est l’icône par défaut qui est utilisée.
Pour avoir une icône personnalisée sur le raccourci du bureau et l’entrée du menu démarrer, après l’avoir créée (j’utilise le freeware Gfie 64 bits pour créer mes icônes) ou récupérée sur Internet ou sur son PC :
4-2-2-1. Étape 1 : rendre l’icône disponible pour l’installeur▲
Afficher le setup dans Visual studio, pour cela double cliquer dans l’explorateur de solutions sur « Sortie principale fromPathlength checkerGui » (ou « Sortie principale from Pathlength checker »).
Il faut maintenant copier l’icône dans « Application Folder » :
Clic droit sur Application Folder-> Add → Fichier → sélectionner l’ icône personnalisée. On peut aussi la copier dans « Users’s Desktop » et « User’s Programs Menu » (compte tenu de sa faible taille). On l’utilisera à l’étape 3 Affecter l’icône au short cutAffecter l’icône au short cut
4-2-2-2. Étape 2 : créer le short cut▲
Puis toujours dans « Application Folder » -> clic droit sur Sortie principale fromxxxxxx(xxx=nom de l'appli)-> create shortcut -> déplacer (drag and drop) le raccourci (après l'avoir renommé à sa convenance) dans User's Desktop .
Le raccourci est créé.
On le renomme :
4-2-2-3. Étape 3 : affecter l’icône au short cut▲
On va affecter notre icône personnalisée au raccourci que l’on vient de renommer, pour cela : clic droit sur ce dernier, puis clic gauche sur l’item « Fenêtre de propriétés (F4) » du menu déroulant :
Dans la fenêtre propriété du Shortcut, Icon est valorisé à « none ». Sélectionner Browse -> sélectionner l'icône personnalisée là où on l’a mise préalablement (User’s Desktop, application folder, User’s Program menu).
Résumé des étapes une à trois :
4-2-2-4. Étape 4 : on déplace le shortcut vers le dossier de destination▲
On glisse et dépose (drag and drop) le raccourci dans le dossier User’s Desktop
Procéder de même pour ajouter l'icône dans l'item correspondant du menu (avec le dossier User's Programm Menu).
C’est presque fini, il ne reste plus qu’à générer le Setup.
|
Si à la fin plusieurs raccourcis se trouvent dans l’un des 3 répertoires, il faut n’en conserver qu’un avant de générer le Setup. |
4-3. Génération du Setup▲
Pour que toutes les dependencies (dépendances) soient détectées et intégrées au Setup, il faut que les 3 projets soient générés (programme console, programme Gui, Setup). Pour cela, vérifier qu’ils sont bien cochés dans le gestionnaire de configurations.
S’il n’y a pas d’erreur, c’est fini. Il n’y a plus qu’à le tester.
5. Test et lancement du Setup▲
On ouvre l’explorateur de fichiers après un clic droit sur Setup :
Notre Setup comporte deux fichiers :
Pour le lancer, exécuter un double clic sur Setup.exe.
On peut modifier le répertoire d’installation proposé.
Après avoir demandé l’accord de l’utilisateur pour procéder à des modifications de son appareil (Contrôle de compte utilisateur-UAC), l’installeur procède à l’installation.
Quelques secondes après, l’installation est terminée :
C’est fini !
Pour la rédaction du tutoriel, j’ai construit à plusieurs reprises le Setup, en l’effaçant pour pouvoir revenir sur une étape. Pour cette raison, le nom du projet Setup est « Setup » ou « Setup1 ». Considérez comme identiques ces deux noms. Quand on ajoute un nouveau projet, Setup Visual Studio le nomme par défaut « Setup », s’il y a déjà un répertoire « Setup », il nomme le nouveau projet « Setup1 ». On peut changer ce nom si on le désire.
5-1. Ce qu’à fait le Setup▲
5-1-1. Dans le répertoire programmes (x86)▲
5-1-2. Sur le bureau▲
Double clic sur le raccourci et l’utilitaire se lance.
Ça marche !
5-1-3. Dans le menu démarrer▲
Suivant les applications déjà présentes dans « Récemment ajoutées », notre programme y figurera ou non. On peut éventuellement effacer préalablement cette liste si on veut le voir à coup sûr.
et
5-1-4. Dans paramètres « Applications et fonctionnalités »▲
Je n’ai pas trouvé comment afficher l’icône personnalisée.
6. Les limitations de Visual Studio Installer▲
Il y en a de nombreuses par rapport à un installeur professionnel, en voici quelques-unes :
- pas de test de la version du système d'exploitation avant d’installer ;
- pas de modification de la base de registres ;
- pas de choix du type d’installation (typique, personnalisée, complète) ;
- pas de choix de la langue d’installation ;
- pas de lancement de l’application à la fin du Setup ;
- pas d’installation de service ;
- pas de recherche de fichiers ou composants sur le PC (fichiers licence par exemple).
…
Cette liste de limitations, non exhaustive, fait que Visual Studio Installer Projects n’est pas destiné à des projets lourds.
7. D’autres installeurs libres et assez simples▲
Il y en a de très nombreux (un simple .bat peut parfois faire l’affaire)
Si on se cantonne à quelques installeurs « basiques freeware »
On peut citer :
- ClickOnce ;
- WiX ;
- Application Packaging ;
- Inno Setup.
7-1. ClickOnce▲
Le nom est très vendeur (mais un seul clic ne suffit pas tout à fait…). Rien à installer dans Visual Studio. Plus de possibilités que Visual Studio Installers Projects. Technologie au goût du jour. La documentation est claire et complète. L’application n’est pas installée dans Program Files ou Program Files (X86) mais dans Application data !
ClickOnce permet des mises à jour de programmes très faciles.
Exemple :
avec notre utilitaire installé grâce à CickOnce, l’exécutable est dans :
C:\Users\gabri\AppData\Local\Apps\2.0\Y27P8Q50.2CA\6MT21Z4Z.YBC\path..tion_fc49455a79f7119e_0001.0000_e29784ba905e4c94\PathLengthCheckerGUI.exe .
7-2. WiX▲
Écrit en open source, il propose une version dédiée pour Visual Studio.
C’est un produit complet, mais il faut prévoir du temps pour se l’approprier. En gros, il faut dans l’ossature d’un fichier XML, rajouter des lignes pour tout ce que doit faire le Setup. Dans un premier temps, le plus simple est de télécharger des projets WIX. Il y en a de très nombreux sur gitHub. Il suffit ensuite de personnaliser celui qui correspond le plus à ce que l’on veut faire.
Pour l’anecdote, à une époque lointaine, c’était le seul programme Open source de Microsoft !
Il faut installer l’extension WIX à Visual Studio et Le WIX Toolset.
7-3. Application Packaging▲
Il faut ajouter à la solution un projet de création de packages d’application Windows. Cette technologie est récente.
7-4. Inno Setup▲
Écrit en open source. Très utilisé initialement pour les programmes en Delphi notamment. Pour les applications C#, la difficulté pour un novice sera de déterminer les « dépendences » du programme (DLL nécessaires et autres Framework). Ne génère pas de .msi (fichier traditionnel pour installer sous Windows), mais un format propriétaire (qui peut éventuellement être converti en .msi avec une application tierce).
8. Quelques liens utiles▲
8-1. Une vidéo YouTube▲
https://www.youtube.com/watch?v=tiHBwAp_Kz4
N’utilise pas le Wizard, tout est fait « à la main ». Vidéo de qualité réalisée en anglais.
8-2. Un tutoriel en Anglais▲
9. Vocabulaire (terminologie) Microsoft▲
Solution : un ou plusieurs projets (à priori ayant un rapport entre eux) qui sont chargés simultanément dans Visual Studio quand on ouvre le fichier solution (*.sln). Dans Delphi par exemple on parle de groupe de projets.
Projet : du point de vue logique, un projet contient notamment tous les fichiers de code source, icônes, images, fichiers de données et ainsi de suite, qui sont compilés dans un fichier exécutable (extrait partiel de la documentation Microsoft sur Visual Studio).
Générer : créer l’exécutable (1) en précompilant les sources. On peut compiler une solution (tous les projets sélectionnés sont créés) ou générer un seul projet.
Régénérer : recréer tous les fichiers alors qu’avec « générer » seuls les fichiers qui sont affectés par les modifications depuis la dernière génération sont générés.
(1) en fait l’Assembly qui est du code intermédiaire qui sera exécuté par le runtime .net.
Packages NuGet : c’est du code réutilisable que les autres développeurs mettent à votre disposition pour l’utiliser dans vos projets. Visual Studio permet d’intégrer très facilement ce code. On peut aussi définir NuGet comme un gestionnaire de bibliothèques (packages) externes.
10. Pour améliorer un peu l’ergonomie de l’application Path Length Checkers▲
Pour améliorer un peu, à mon goût, l’interface utilisateur (à intégrer aux sources ou pas. Dans un premier temps on pourra s’en dispenser).
Au volet solution : Projet PathLengthCheckerGUI → clic droit → définir comme projet de démarrage
À la form de PathLengthCheckerGUI : MainWindows.xaml diminuer la Largeur des boutons Get Path Lengths, Copy Paths to Clipboard without Lengths, Copy Paths to Clipboard . Les libellés de la form peuvent éventuellement être traduits en français.
Au code :
// dans l’explorateur de solution cliquer sur « mainwindows.xaml.cs »
// clic droit dans la fenêtre → afficher le code :
private void
btnGetPathLengths_Click
(
object sender, RoutedEventArgs e)
{
Mouse.OverrideCursor =
Cursors.Wait; //Ajout
GetPaths
(
);
Mouse.OverrideCursor =
Cursors.Arrow; //Ajout
private void
Window_Loaded
(
object sender, RoutedEventArgs e)
//init val long path et search pattern
{
numMinPathLength.Value =
240
; // Ajout, cette valeur peut être optimisée
txtSearchPattern.Text =
"
*
"
;// ajout, superflu (c’est fait dans le programme) mais plus clair
}
Mainwindows.xaml.cs ligne 132
if
(
Paths.Count ==
0
)
{
MessageBox.Show
(
"
Aucun répertoire ou fichier ne correspond aux critères
"
); }
11. Remerciements▲
Je remercie Chrtophe pour sa relecture technique ainsi qu’Escartefigue pour la relecture orthographique et l’amélioration du style.