Aller au contenu

Créer un installateur Windows pour une application .NET (WPF, WinForms, console)

Publiez une application de bureau .NET avec dotnet publish, choisissez entre dépendante du framework et autonome, puis transformez le dossier de publication en Setup.exe avec raccourcis et désinstallateur.

Mis à jour le 31 octobre 2026 · 4 min de lecture

Visual Studio compile votre application WPF ou WinForms, et dotnet publish vous donne un dossier qui fonctionne partout. Ce qui manque, c'est l'installateur : l'entrée dans le menu Démarrer, le dossier dans Program Files, l'entrée de désinstallation dans les Paramètres Windows. Les anciens ClickOnce et Visual Studio Installer Projects existent toujours, mais les deux accusent leur âge. Voici le chemin le plus direct d'un projet .NET à un Setup.exe.

Étape 1 : publier l'application

La publication produit un dossier contenant tout ce dont l'application a besoin. Lancez-la depuis le dossier du projet :

dotnet publish -c Release -r win-x64 --self-contained true

La sortie se trouve sous bin\Release\net8.0-windows\win-x64\publish\ (le framework cible dans le chemin varie selon votre projet). C'est ce dossier que vous distribuez.

La seule décision qui compte :

  • Autonome (--self-contained true) embarque le runtime .NET. Le dossier pèse de 70 à 150 Mo, mais il fonctionne sur n'importe quelle machine Windows sans rien installer au préalable. Choisissez cette option pour un logiciel distribué au grand public.
  • Dépendante du framework (--self-contained false) ne pèse que quelques Mo, mais l'utilisateur doit avoir installé le .NET Desktop Runtime correspondant, sinon l'application affiche une invite de téléchargement au premier lancement. Convient aux outils internes sur des machines gérées.

Options utiles :

  • -p:PublishReadyToRun=true précompile l'application pour un démarrage plus rapide.
  • -p:PublishSingleFile=true regroupe la sortie en un seul .exe. Cela fonctionne, mais un installateur supprime la raison de s'en servir, et les applications à fichier unique décompressent les bibliothèques natives au premier lancement. Le dossier classique est plus simple.
  • Le trimming (PublishTrimmed) n'est pas pris en charge pour WPF et WinForms ; laissez-le désactivé.

Définissez l'icône de l'application dans le fichier de projet pour que le .exe publié la porte :

<PropertyGroup>
  <ApplicationIcon>app.ico</ApplicationIcon>
</PropertyGroup>

Lancez une fois le .exe publié depuis le dossier de publication, idéalement sur une machine sans Visual Studio, pour vérifier qu'il ne manque rien.

Étape 2 : zipper le dossier de publication

Zippez le contenu de publish` : le .exe, les DLL, .deps.json, .runtimeconfig.json et les éventuels fichiers de contenu. Laissez de côté les fichiers .pdb`, sauf si vous voulez des symboles de plantage sur les machines de vos clients.

Étape 3 : construire l'installateur

  1. Téléversez le zip sur ExeTup. Il choisit le .exe de votre application comme programme principal ; confirmez-le, car une publication autonome contient createdump.exe, qui ne l'est pas.
  2. Renseignez le nom, la version (gardez-la alignée sur <Version> dans le projet), l'éditeur et la licence.
  3. Choisissez tous les utilisateurs pour une application de bureau classique dans Program Files, ou utilisateur actuel lorsque vos clients risquent de ne pas avoir les droits d'administration.
  4. Gardez 64 bits pour une publication win-x64 ; choisissez 32 bits pour win-x86.
  5. Téléversez le même app.ico, activez les raccourcis et lancez la construction.

Téléchargez Setup.exe et testez l'installation et la désinstallation sous Windows.

Remarques propres à .NET

  • Mises à jour. Distribuez un nouvel installateur avec une version supérieure. Installer par-dessus l'ancienne version remplace les fichiers ; l'installateur n'inclut pas de canal de mise à jour automatique.
  • Paramètres et données. Écrivez les données utilisateur dans %APPDATA% ou %LOCALAPPDATA%, pas à côté du .exe. Program Files est en lecture seule pour les utilisateurs normaux, et le désinstallateur ne supprime que ce qu'il a installé.
  • Prérequis. Les publications autonomes n'ont besoin de rien d'autre. Si votre application a besoin du runtime Visual C++ ou d'un pilote de base de données, documentez-le ; l'installateur n'enchaîne pas d'autres installateurs.
  • Signature de code. Signez le .exe publié avant de le zipper, puis signez le Setup.exe téléchargé. Voir le guide SmartScreen.

Alternatives

  • Visual Studio Installer Projects produit des fichiers MSI depuis Visual Studio. Toujours disponible sous forme d'extension, limité et peu commode avec les publications autonomes.
  • ClickOnce offre des installations par utilisateur avec mise à jour automatique, liées à un serveur web que vous maintenez.
  • WiX Toolset construit des fichiers MSI à partir de XML et constitue la référence pour l'empaquetage MSI de niveau entreprise. Puissant, avec une courbe d'apprentissage à la hauteur.
  • MSIX est le format de paquet plus récent de Microsoft, idéal quand vous visez le Microsoft Store.

Consultez Installateurs MSI ou EXE pour savoir quand le format a de l'importance.

Questions fréquentes

Dois-je publier en mode dépendant du framework ou autonome ?

Autonome pour tout ce que vous remettez au public, afin que l'application fonctionne sans téléchargement de runtime. Dépendant du framework pour les outils internes sur des machines où le service informatique gère le runtime .NET.

L'installateur inclut-il le runtime .NET ?

Si vous publiez en mode autonome, oui, car il fait partie du dossier de publication. L'installateur livre ce qui se trouve dans le zip.

Puis-je produire un MSI pour la stratégie de groupe ?

ExeTup construit un Setup.exe. Il s'installe silencieusement avec /S, ce qui couvre la plupart des déploiements scriptés. Pour les stratégies qui n'acceptent que du MSI, WiX est l'outil adapté.

Avec quelles versions de .NET cela fonctionne-t-il ?

Toutes celles qui produisent un dossier de publication : .NET 6, 7, 8, 9 et ultérieures, ainsi que les applications .NET Framework compilées avec Visual Studio (utilisez la sortie bin\Release).

Guides associés