Créer une application WPF avec un projet SDK-style grâce à MSBuildSdkExtras
Depuis la première version stable du SDK .NET Core, on a pu profiter d'un nouveau format de projet C#, souvent appelé "SDK-style" car on spécifie le SDK à utiliser dans le fichier projet. C'est toujours un fichier XML avec une extension .csproj, il est toujours basé sur MSBuild, mais il est beaucoup plus léger et plus facile à éditer à la main. Personnellement, j'en suis fan et je l'utilise partout ou je peux.
Cependant, par défaut il est seulement utilisable pour certains types de projets : applications ASP.NET Core, applications console et bibliothèques de classes. Pour une application WPF, par exemple, on est coincé avec l'ancien format de projet, lourd et peu pratique. .NET Core 3.0 va changer cela, mais sa sortie n'est pas pour tout de suite.
MSBuildSdkExtras
Heureusement, Oren Novotny a créé un projet très sympa nommé MSBuildSdkExtras. C'est, en gros, une extension du SDK .NET Core qui ajoute les propriétés et cibles MSBuild manquantes pour pouvoir compiler des types de projets qui ne sont pas supportés nativement. Il se présente comme un SDK alternatif, c'est-à-dire qu'au lieu de spécifier Sdk="Microsoft.NET.Sdk"
dans l'élément racine du projet, on écrit Sdk="MSBuild.Sdk.Extras/1.6.61"
. Le SDK sera automatiquement résolu et installé depuis NuGet (notez qu'il faut utiliser VS2017 15.6 ou supérieur pour que ça fonctionne). Il est aussi possible de spécifier simplement Sdk="MSBuild.Sdk.Extras"
dans le fichier projet, et de spécifier la version du SDK dans un fichier global.json
dans le dossier racine de la solution, comme ceci :
{ "msbuild-sdks": { "MSBuild.Sdk.Extras": "1.6.61" } }
Cette approche est utile pour partager la version du SDK entre plusieurs projets.
Comment créer un projet WPF "SDK-style"
Voyons comment créer un projet WPF avec le nouveau format de projet. Suivez les étapes habituelles pour créer une application WPF dans Visual Studio. Une fois que c'est fait, déchargez le projet et éditez le fichier csproj ; remplacez tout le contenu du fichier par ceci :
<Project Sdk="MSBuild.Sdk.Extras/1.6.61"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net471</TargetFramework> <ExtrasEnableWpfProjectSetup>true</ExtrasEnableWpfProjectSetup> </PropertyGroup> </Project>
Rechargez le projet et supprimez le fichier Properties/AssemblyInfo.cs
. Et voilà, vous pouvez maintenant compiler et exécuter le projet comme d'habitude, mais avec un fichier projet plus compact et plus moderne !
Quelques remarques :
ExtrasEnableWpfProjectSetup
est une propriété de MSBuildSdkExtras qui permet d'activer le support de WPF (qui n'est pas activé par défaut). En gros, cela indique à MSBuild d'inclure les types de fichier propres à WPF avec l'action de build appropriée (par exempleApplicationDefinition
pour le fichierApp.xaml
,Page
pour les autres fichiers XAML, etc.) et met en place les tâches MSBuild nécessaires à la compilation XAML.- Le fichier
Properties/AssemblyInfo.cs
est redondant, car un fichier avec les mêmes attributs est généré automatiquement par le SDK. Vous pouvez contrôler comment les attributs sont générés en définissant les propriétés listées sur cette page. Si vous préférez garder votre propre fichier AssemblyInfo, vous pouvez définir la propriétéGenerateAssemblyInfo
à false dans le fichier projet.
Limitations
Bien qu'il soit très pratique de pouvoir utiliser ce format de projet pour des applications WPF, il y a quelques limitations à connaître :
- Bien qu'on utilise le format de projet du SDK .NET Core, on a besoin de tâches MSBuild spécifiques à WPF, qui ne sont pas disponibles dans le SDK .NET Core. On ne peut donc pas utiliser
dotnet build
pour compiler, il faut absolument utiliser MSBuild (ou Visual Studio, qui utilise MSBuild). - Ce format pour les projets WPF n'est pas entièrement supporté par Visual Studio ; on peut compiler et exécuter sans problème, mais certaines fonctionnalités ne fonctionneront pas correctement, par exemple Visual Studio ne proposera pas les templates de fichier WPF lors de l'ajout d'un nouvel élément au projet.
Mais même avec ces limitations, MSBuildSdkExtras nous donne un avant goût de ce qu'on pourra faire avec .NET Core 3.0 !
Commentaires