Distribuer une application .NET sans nécessiter l’installation préalable du framework est une demande fréquente. Avec .NET 9, il est possible de publier une app MAUI auto-hébergeant une API ASP.NET via Kestrel, le tout dans un exécutable unique et autonome.
Ce guide montre comment procéder pas à pas, en ciblant Windows (la seule plateforme supportée actuellement pour le combo MAUI + ASP.NET Core).
🎯 Objectif
Créer un .exe autonome contenant :
- une interface MAUI Windows (WinUI)
- une API ASP.NET Core Kestrel auto-hébergée
- le runtime .NET 9 embarqué
- sans installer .NET sur la machine cible
📁 1. Configuration du .csproj
Dans votre projet MAUI (fichier .csproj), ajoutez les propriétés suivantes :
<PropertyGroup>
<TargetFramework>net9.0-windows10.0.19041.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<PublishTrimmed>false</PublishTrimmed> <!-- MAUI ne supporte pas encore le trimming? -->
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
</PropertyGroup>
Notes :
- SelfContained=true : embarque tout le runtime .NET
- PublishSingleFile=true : crée un .exe unique
- PublishTrimmed=false : MAUI ne supporte pas le trimming, risque de runtime errors
- RuntimeIdentifier=win-x64 : cible Windows 64-bit
⚙️ 2. Commande de publication
Dans le terminal, positionnez-vous dans le dossier de votre projet MAUI et exécutez :
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true
Le fichier .exe sera généré dans :
bin\Release\net9.0-windows10.0.19041.0\win-x64\publish\
🧪 3. Lancer l’API Kestrel dans l’app MAUI
Si ce n’est pas encore fait, ajoutez le démarrage de l’API dans MauiProgram.cs :
Task.Run(() =>
{
var builder = WebApplication.CreateBuilder();
builder.WebHost.UseUrls("http://localhost:5001");
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run(); // bloquant
});
Cela permet à votre application MAUI d’héberger une API ASP.NET Core localement via Kestrel.
📦 4. Distribution
Copiez simplement le fichier .exe (et les éventuels fichiers annexes si PublishSingleFile est désactivé) sur une machine Windows 64-bit sans .NET installé. Aucun setup n’est requis.
Si vous avez laissé PublishTrimmed=false, l’exécutable fera typiquement entre 90 et 140 Mo.
📌 Limitations
- MAUI ne supporte pas encore complètement le trimming, donc PublishTrimmed doit rester à false. (A vérifier quand vous lirez cet article les choses peuvent avoir changé depuis son écriture !)
- Ce type d’exécutable fonctionne uniquement sur Windows.
- Si vous utilisez des DLL natives (SQLite, SkiaSharp, etc.), vérifiez leur inclusion correcte via IncludeNativeLibrariesForSelfExtract.
✅ En résumé
|
Action
|
Option
|
|
Cibler Windows
|
<RuntimeIdentifier>win-x64</...>
|
|
Rendre autonome
|
<SelfContained>true</...>
|
|
Exécutable unique
|
<PublishSingleFile>true</...>
|
|
Empaqueter avec Kestrel
|
Démarrer dans MauiProgram.cs
|
🧩 Pour aller plus loin
- Créer un script PowerShell de publication automatique
- Intégrer un mécanisme de self-update
- Générer un installeur avec MSIX ou InnoSetup si besoin d'une distribution contrôlée
Tous ces ajouts peuvent s'avérer nécessaires pour une App réellement terminée, mais je ne vais pas transformer cet article en livre, donc nous verrons cela dans d'autres billets, d'ici là ...
Stay Tuned !