Créer un exécutable autonome en .NET 9 pour distribution sans installateur

Distribuer une application .NET dans un seul exécutable autonome, sans dépendance à .NET préinstallée, sans installateur MSI ni setup.exe, juste un .exe que l’utilisateur double-clique. Un rêve ? Non une réalité !

Cette méthode est idéale pour :

  • les utilitaires internes
  • les outils ponctuels
  • les apps à exécuter sur machines non connectées

🧱 Pré-requis

  • Visual Studio 2022+ ou CLI .NET 9
  • Projet console, WPF, WinForms ou WinUI 3 packagé
  • Ciblage : Windows (ex : win-x64, win-arm64)

🛠️ Étapes de base

  1. Modifier le .csproj

Ajoutez les propriétés suivantes :

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  <PublishSingleFile>true</PublishSingleFile>
  <PublishTrimmed>true</PublishTrimmed> <!-- attention à tester -->
  <SelfContained>true</SelfContained>
</PropertyGroup>

💡 Pour WinUI 3, ciblez un projet packagé (Packaged WinAppSDK).

  1. Publier via CLI
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true

Le fichier unique généré sera dans :

bin\Release\net9.0\win-x64\publish\

Et il inclura le runtime .NET complet, plus vos dépendances et DLL, compacté dans un .exe.

  1. Exemple : Hello World minimal autonome
Console.WriteLine("Bonjour, je suis une app autonome .NET 9 !");
Console.ReadKey();

Publié avec :

dotnet publish -r win-x64 -c Release --self-contained true /p:PublishSingleFile=true

Résultat : un HelloApp.exe de ~50 à 70 Mo, qui fonctionne sur toute machine Windows x64, même sans .NET installé.

⚠️ Pièges courants

Problème

Solution

Taille trop grande

Activer PublishTrimmed, utiliser AOT si possible

Bugs au runtime

Tester sans PublishTrimmed ou ajuster linker config

Dépendance native manquante

Vérifier les DLL natives embarquées

WPF/WinUI packagé : erreurs MSIX

Publier en mode packaged avec l'outil approprié

💡 Astuces avancées

  • Utilisez le mode ReadyToRun (<PublishReadyToRun>true</PublishReadyToRun>) pour accélérer le démarrage.
  • Combinez avec un script PowerShell ou bat pour déployer sur plusieurs postes.
  • Pour les lignes de commande, créer un outil CLI autonome multiplateforme avec dotnet new console.

🎯 Cas d’usage typiques

  • Utilitaire graphique à usage unique (WinForms, WPF)
  • Mini serveur local (Kestrel)
  • Outil CLI de conversion ou génération
  • Démonstrateur IA packagé avec modèle local (embedding, RAG, etc.)

Conclusion

Avec .NET 9, produire un exécutable autonome et portable est devenu simple. Cela redonne à .NET un usage "à la Win32" très attendu dans l'industrie : copier-coller → double-clic → ça marche.

Stay Tuned !