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
- 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).
- 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.
- 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 !