Depuis que je travaille avec la communauté sur le portage d'applications de bureau de .NET Framework vers .NET Core, j'ai remarqué qu'il y a deux camps de personnes: certains veulent une liste d'instructions très simple et brève pour que leurs applications soient portées .NET Core tandis que d'autres préfèrent une approche plus fondée sur des principes avec plus d'informations contextuelles. Au lieu de rédiger un document «couteau suisse», nous allons publier deux articles de blog, un pour chaque camp:
- Ce message est le cas simple . Il se concentre sur des instructions simples et des applications plus petites et est le moyen le plus simple de déplacer votre application vers .NET Core.
- Nous publierons un autre article pour les cas plus compliqués . Ce post se concentrera davantage sur les applications non triviales, telles que les applications WPF avec des dépendances sur WCF et les packages d'interface utilisateur tiers.
Si vous préférez regarder des vidéos plutôt que de les lire, voici la vidéo où je fais tout ce qui est décrit ci-dessous.
Étape 0 - Prérequis
Pour porter vos applications de bureau sur Core, vous aurez besoin de .NET Core 3 et Visual Studio 2019.
Étape 1 - Exécutez l'analyseur de portabilité
Avant le portage, vous devez vérifier la compatibilité de votre application avec .NET Core. Pour ce faire, téléchargez et exécutez .NET Portability Analyzer .
- Sur le premier onglet, Résumé de la portabilité, si vous n'avez que 100% dans la colonne .NET Core (tout est surligné en vert), votre code est entièrement compatible, passez à l'étape 2.
- Si vous avez des valeurs inférieures à 100%, examinez d'abord tous les assemblys qui ne font pas partie de votre application. Pour ceux-ci, vérifiez si leurs auteurs fournissent des versions pour .NET Core ou .NET Standard.
- Regardez maintenant l'autre partie des assemblys qui proviennent de votre code. Si aucun de vos assemblys n'est répertorié dans le rapport de portabilité, passez à l'étape 2. Sinon, ouvrez l'onglet Détails, filtrez le tableau en cliquant sur la colonne Assemblage et concentrez-vous uniquement sur ceux qui proviennent de votre application. Parcourez la liste et refactorisez votre code pour cesser d'utiliser l'API ou remplacez l'utilisation de l'API par des alternatives de .NET Core.

Étape 2 - Migrez vers .csproj de style SDK
Dans l' Explorateur de solutions , faites un clic droit sur votre projet (pas sur la solution!). Voyez-vous Modifier le fichier de projet ? Si vous le faites, vous utilisez déjà le fichier de projet de style SDK, vous devez donc passer à l' étape 3 . Sinon, procédez comme suit.
- Vérifiez dans l' Explorateur de solutions si votre projet contient un fichier
packages.config
. Si vous ne le faites pas, aucune action n'est nécessaire, si vous le faites, faites un clic droit sur packages.config
et choisissez Migrer packages.config vers PackageReference . Cliquez ensuite sur OK . - Ouvrez votre fichier de projet en cliquant avec le bouton droit sur le projet et choisissez Décharger le projet . Cliquez ensuite avec le bouton droit sur le projet et choisissez Modifier <votre nom de projet> .csproj .
- Copiez le contenu du fichier de projet quelque part, par exemple dans le Bloc-notes, afin de pouvoir le rechercher ultérieurement.
- Supprimez tout de votre fichier de projet ouvert dans Visual Studio (je sais que cela semble agressif, mais nous ajouterons uniquement le contenu nécessaire de la copie que nous venons de faire en quelques étapes). Au lieu du texte que vous venez de supprimer, collez le code suivant. Pour une application WinForms:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project>
Pour une application WPF:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project>
- Dans le Bloc-notes, recherchez
PackageReference
. Si vous n'avez rien trouvé, passez à autre chose. Si vous avez trouvé PackageReference
, copiez l'intégralité de <ItemGroup>
qui contient PackageReference
dans votre fichier de projet, ouvert dans Visual Studio, juste en dessous des lignes que vous avez collées à l'étape ci-dessus. Faites-le pour chaque occurrence de PackageReference
vous avez trouvée. Le bloc copié devrait ressembler à ceci.
<ItemGroup> <PackageReference Include="NUnit"> <Version>3.11.0</Version> </PackageReference> </ItemGroup>
- Faites maintenant la même chose que ci-dessus pour
ProjectReference
. Si vous n'avez rien trouvé, passez à autre chose. Si vous avez trouvé des éléments ProjectReference
, ils ressembleraient à ceci.
<ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj"> <Project>{7bce0d50-17fe-4fda-b6b7-e7960aed8ac2}</Project> <Name>WindowsFormsApp1</Name> </ProjectReference> </ItemGroup>
- Vous pouvez supprimer des lignes avec les propriétés
<Project>
et <Name>
, car elles ne sont pas nécessaires dans le nouveau style de fichier de projet. Donc, pour chaque ProjectReference
que vous avez trouvé (le cas échéant), copiez uniquement ItemGroup
et ProjectReference
comme ceci.
<ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj" /> </ItemGroup>
Sauvegardez tout. Fermez le fichier .csproj dans Visual Studio. Cliquez avec le bouton droit sur votre projet dans l' Explorateur de solutions et sélectionnez Recharger le projet . Reconstruisez et assurez-vous qu'il n'y a pas d'erreurs.
Bonne nouvelle, vous venez de mettre à jour votre fichier de projet vers le nouveau style SDK! Le projet cible toujours .NET Framework, mais vous pourrez désormais le recibler vers .NET Core.
Étape 3 - Recibler vers .NET Core
Ouvrez votre fichier de projet en double-cliquant sur votre projet dans l' Explorateur de solutions . Recherchez la propriété <TargetFramework>
et remplacez la valeur par netcoreapp3.0
. Maintenant, votre fichier de projet devrait ressembler à ceci:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> ... </PropertyGroup> ... </Project>
Créez et exécutez votre projet. Félicitations, vous avez porté sur .NET Core 3!
Correction des erreurs
Si vous obtenez des erreurs comme
The type or namespace <some name> could not be found
ou
The name <some name> does not exist in the current context
et votre rapport de portabilité était vert, il devrait être facile à corriger en ajoutant un package NuGet avec la bibliothèque correspondante. Si vous ne trouvez pas le package NuGet avec la bibliothèque manquante, essayez de référencer Microsoft.Windows.Compatibility . Ce package ajoute ~ 21K API .NET à partir de .NET Framework.
Travailler avec des designers
Même s'il est possible de modifier l'interface utilisateur de votre application via du code, les développeurs préfèrent généralement utiliser les concepteurs visuels. Avec .NET Core, nous avons dû reconcevoir la façon dont les concepteurs travaillent avec les projets .NET Core:
- Le concepteur WPF est déjà en préversion et nous travaillons sur l'ajout de fonctionnalités supplémentaires.
- Le concepteur WinForms pour .NET Core sera disponible plus tard, et en attendant, vous pouvez utiliser le concepteur WinForms .NET Framework comme solution de contournement.
Voici comment utiliser le concepteur WinForms .NET Framework:
- Copiez votre fichier .csproj (disons que vous avez
MyProject.csproj
), donnez-lui un nom différent, par exemple MyProject.NetFramework.csproj
et placez-le à côté de votre fichier de projet existant. - Assurez-vous que votre projet est fermé dans Visual Studio, ouvrez le nouveau projet
MyProject.NetFramework.csproj
.
Dans l' Explorateur de solutions, cliquez avec le bouton droit sur votre projet et sélectionnez Propriétés . Dans l'onglet Application (doit être ouvert par défaut), définissez le nom de l' assembly et l' espace de noms par défaut sur les mêmes valeurs que dans votre projet initial (supprimez «.NetFramework» des noms).
Enregistrez cette solution à côté de votre solution existante. - Ouvrez le nouveau fichier de projet et remplacez
<TargetFramework>
par net472
. - Maintenant, lorsque vous devez utiliser le concepteur WinForms, chargez votre projet avec le fichier de projet
MyProject.NetFramework.csproj
et vous obtiendrez l'expérience complète du concepteur .NET Framework. Lorsque vous avez terminé avec le concepteur, fermez et ouvrez votre projet avec le fichier de projet .NET Core. - Il s'agit simplement d'une solution de contournement jusqu'à ce que le concepteur WinForms pour .NET Core soit prêt.
Pourquoi porter sur .NET Core
Regardez la vidéo où Scott Hunter et moi parlons de toutes les nouveautés à venir avec le portage .NET Core 3 vers .NET Core 3.0 .