Partager via


Partie 1 : Migrer l’application Contoso Expenses vers .NET Core 3

Il s’agit de la première partie d’un didacticiel qui montre comment moderniser un exemple d’application de bureau WPF nommée Contoso Expenses. Pour obtenir une vue d’ensemble du didacticiel, des prérequis et des instructions pour télécharger l’exemple d’application, consultez Tutoriel : Moderniser une application WPF.

Dans cette partie du tutoriel, vous allez migrer l’ensemble de l’application Contoso Expenses de .NET Framework 4.7.2 vers .NET Core 3. Avant de commencer cette partie du didacticiel, veuillez ouvrir et compiler l'exemple ContosoExpenses dans Visual Studio 2019.

Remarque

Pour plus d’informations sur la migration d’une application WPF du .NET Framework vers .NET Core 3, consultez cette série de blog.

Migrer le projet ContosoExpenses vers .NET Core 3

Dans cette section, vous allez migrer le projet ContosoExpenses dans l’application Contoso Expenses vers .NET Core 3. Pour ce faire, vous allez créer un fichier projet qui contient les mêmes fichiers que le projet ContosoExpenses existant, mais qui cible .NET Core 3 au lieu du .NET Framework 4.7.2. Cela vous permet de gérer une seule solution avec les versions .NET Framework et .NET Core de l’application.

  1. Vérifiez que le projet ContosoExpenses cible actuellement le .NET Framework 4.7.2. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet ContosoExpenses, choisissez Propriétés, puis vérifiez que la propriété Framework cible sous l’onglet application est définie sur .NET Framework 4.7.2.

    .NET Framework version 4.7.2 du projet

  2. Dans l’Explorateur Windows, accédez au dossier C :\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses et créez un fichier texte nommé ContosoExpenses.Core.csproj.

  3. Cliquez avec le bouton droit sur le fichier, choisissez Ouvrir avec, puis ouvrez-le dans un éditeur de texte de votre choix, tel que le Bloc-notes, Visual Studio Code ou Visual Studio.

  4. Copiez le texte suivant dans le fichier et enregistrez-le.

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
     </PropertyGroup>
    
    </Project>
    
  5. Fermez le fichier et revenez à la solution ContosoExpenses dans Visual Studio.

  6. Cliquez avec le bouton droit sur la solution ContosoExpenses, puis choisissez Ajouter -> Projet existant. Sélectionnez le fichier ContosoExpenses.Core.csproj que vous venez de créer dans le dossier C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses pour l’ajouter à la solution.

Le ContosoExpenses.Core.csproj inclut les éléments suivants :

  • L’élément Project spécifie une version du Kit de développement logiciel (SDK) de Microsoft.NET.Sdk.WindowsDesktop. Cela fait référence aux applications .NET pour Windows Desktop et inclut des composants pour les applications WPF et Windows Forms.
  • L’élément PropertyGroup contient des éléments enfants qui indiquent que la sortie du projet est un exécutable (et non une DLL), cible .NET Core 3 et utilise WPF. Pour une application Windows Forms, vous devez utiliser un élément UseWinForms au lieu de l’élément UseWPF.

Remarque

Lorsque vous utilisez le format .csproj introduit avec .NET Core 3.0, tous les fichiers du même dossier que .csproj sont considérés comme faisant partie du projet. Par conséquent, vous n’avez pas besoin de spécifier chaque fichier inclus dans le projet. Vous devez spécifier uniquement les fichiers pour lesquels vous souhaitez définir une action de génération personnalisée ou que vous souhaitez exclure.

Migrer le projet ContosoExpenses.Data vers .NET Standard

La solution ContosoExpenses inclut une bibliothèque de classes ContosoExpenses.Data qui contient des modèles et des interfaces pour les services et cible .NET 4.7.2. Les applications .NET Core 3.0 peuvent utiliser des bibliothèques .NET Framework, tant qu’elles n’utilisent pas d’API qui ne sont pas disponibles dans .NET Core. Toutefois, le meilleur chemin de modernisation consiste à déplacer vos bibliothèques vers .NET Standard. Cela garantit que votre bibliothèque est entièrement prise en charge par votre application .NET Core 3.0. En outre, vous pouvez réutiliser la bibliothèque également avec d’autres plateformes, telles que le web (via ASP.NET Core).

Pour migrer le projet ContosoExpenses.Data vers .NET Standard :

  1. Dans Visual Studio, cliquez avec le bouton droit sur le projet ContosoExpenses.Data et choisissez Décharger le projet. Cliquez à nouveau avec le bouton droit sur le projet, puis choisissez Modifier ContosoExpenses.Data.csproj.

  2. Supprimez l’intégralité du contenu du fichier projet.

  3. Copiez et collez le code XML suivant et enregistrez le fichier.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  4. Cliquez avec le bouton droit sur le projet ContosoExpenses.Data et choisissez Recharger le Projet.

Configurer des packages et des dépendances NuGet

Lorsque vous avez migré les projets ContosoExpenses.Core et ContosoExpenses.Data dans les sections précédentes, vous avez supprimé les références de package NuGet des projets. Dans cette section, il faudra ajouter de nouveau ces références.

Pour configurer des packages NuGet pour le projet ContosoExpenses.Data :

  1. Dans le projet ContosoExpenses.Data, développez le nœud Dépendances. Notez que la section NuGet est manquante.

    Packages NuGet

    Si vous ouvrez le Packages.config dans l’Explorateur de solutions vous trouverez les références « anciennes » des packages NuGet utilisés par le projet lors de l’utilisation du .NET Framework complet.

    dépendances et packages

    Voici le contenu du fichier Packages.config. Vous remarquerez que tous les packages NuGet ciblent le .NET Framework complet 4.7.2 :

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="Bogus" version="26.0.2" targetFramework="net472" />
      <package id="LiteDB" version="4.1.4" targetFramework="net472" />
    </packages>
    
  2. Dans le projet ContosoExpenses.Data, supprimez le fichier Packages.config.

  3. Dans le projet ContosoExpenses.Data, cliquez avec le bouton droit sur le nœud Dépendances, puis choisissez Gérer les packages NuGet.

Gérer les packages NuGet...

  1. Dans la fenêtre du Gestionnaire de paquets NuGet, cliquez sur Parcourir. Recherchez le package Bogus et installez la dernière version stable.

    faux package NuGet

  2. Recherchez le package LiteDB et installez la dernière version stable.

    package LiteDB NuGet

    Vous vous demandez peut-être où ces packages NuGet sont stockés, car le projet n’a plus de fichier packages.config. Les packages NuGet référencés sont stockés directement dans le fichier .csproj. Vous pouvez le vérifier en affichant le contenu de la ContosoExpenses.Data.csproj fichier projet dans un éditeur de texte. Vous trouverez les lignes suivantes ajoutées à la fin du fichier :

    <ItemGroup>
       <PackageReference Include="Bogus" Version="26.0.2" />
       <PackageReference Include="LiteDB" Version="4.1.4" />
    </ItemGroup>
    

    Remarque

    Vous pouvez également remarquer que vous installez les mêmes packages pour ce projet .NET Core 3 que ceux utilisés par les projets .NET Framework 4.7.2. Les packages NuGet prennent en charge le ciblage multiple. Les auteurs de bibliothèques peuvent inclure différentes versions d’une bibliothèque dans le même package, compilées pour différentes architectures et plateformes. Ces packages prennent en charge le .NET Framework complet ainsi que .NET Standard 2.0, qui est compatible avec les projets .NET Core 3. Pour plus d’informations sur les différences entre .NET Framework, .NET Core et .NET Standard, consultez .NET Standard.

Pour configurer des packages NuGet pour le projet ContosoExpenses.Core :

  1. Dans le projet ContosoExpenses.Core, ouvrez le fichier packages.config. Notez qu’il contient actuellement les références suivantes qui ciblent le .NET Framework 4.7.2.

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="CommonServiceLocator" version="2.0.2" targetFramework="net472" />
      <package id="MvvmLightLibs" version="5.4.1.1" targetFramework="net472" />
      <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" />
      <package id="Unity" version="5.10.2" targetFramework="net472" />
    </packages>
    

    Dans les étapes suivantes, vous allez utiliser les versions .NET Standard des packages MvvmLightLibs et Unity. Les deux autres sont des dépendances téléchargées automatiquement par NuGet lorsque vous installez ces deux bibliothèques.

  2. Dans le projet ContosoExpenses.Core, supprimez le fichier Packages.config.

  3. Cliquez avec le bouton droit sur le projet ContosoExpenses.Core, puis choisissez Gérer les packages NuGet.

  4. Dans la fenêtre du Gestionnaire de paquets NuGet, cliquez sur Parcourir. Recherchez le package Unity et installez la dernière version stable.

    package Unity

  5. Recherchez le package MvvmLightLibsStd10 et installez la dernière version stable. Il s’agit de la version .NET Standard du package MvvmLightLibs. Pour ce package, l’auteur a choisi de empaqueter la version .NET Standard de la bibliothèque dans un package distinct de la version du .NET Framework.

    Package MvvmLightsLibs

  6. Dans le projet ContosoExpenses.Core, cliquez avec le bouton droit sur le nœud Dépendances, puis choisissez Ajouter une référence.

  7. Dans la catégorie Projects > Solution, sélectionnez ContosoExpenses.Data, puis cliquez sur OK.

    Ajouter une de référence

Désactiver les attributs d’assembly générés automatiquement

À ce stade du processus de migration, si vous essayez de générer le projet ContosoExpenses.Core, vous verrez des erreurs.

la compilation .NET Core 3 provoque de nouvelles erreurs

Ce problème se produit, car le nouveau format .csproj introduit avec .NET Core 3.0 stocke les informations d’assembly dans le fichier projet plutôt que dans le fichier AssemblyInfo.cs. Pour corriger ces erreurs, désactivez ce comportement et laissez le projet continuer à utiliser le fichier AssemblyInfo.cs.

  1. Dans Visual Studio, cliquez avec le bouton droit sur le projet ContosoExpenses.Core et choisissez Décharger le projet. Cliquez à nouveau avec le bouton droit sur le projet, puis choisissez Modifier ContosoExpenses.Core.csproj.

  2. Ajoutez l’élément suivant dans la section PropertyGroup et enregistrez le fichier.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Après avoir ajouté cet élément, la section PropertyGroup doit maintenant ressembler à ceci :

    <PropertyGroup>
      <OutputType>WinExe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <UseWPF>true</UseWPF>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  3. Cliquez avec le bouton droit sur le projet ContosoExpenses.Core et choisissez Recharger le projet.

  4. Cliquez avec le bouton droit sur le projet ContosoExpenses.Data, puis choisissez Décharger le projet. Cliquez à nouveau avec le bouton droit sur le projet, puis choisissez Modifier ContosoExpenses.Data.csproj.

  5. Ajoutez la même entrée dans la section PropertyGroup et enregistrez le fichier.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Après avoir ajouté cet élément, la section PropertyGroup doit maintenant ressembler à ceci :

    <PropertyGroup>
      <TargetFramework>netstandard2.0</TargetFramework>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  6. Cliquez avec le bouton droit sur le projet ContosoExpenses.Data et choisissez Recharger le Projet.

Ajouter le pack de compatibilité Windows

Si vous essayez maintenant de compiler les projets ContosoExpenses.Core et ContosoExpenses.Data, vous verrez que les erreurs précédentes sont maintenant corrigées, mais qu’il existe toujours des erreurs dans la bibliothèque ContosoExpenses.Data similaire à celles-ci.

Services\RegistryService.cs(9,26,9,34): error CS0103: The name 'Registry' does not exist in the current context Services\RegistryService.cs(12,26,12,34): error CS0103: The name 'Registry' does not exist in the current context Services\RegistryService.cs(12,97,12,123): error CS0103: The name 'RegistryKeyPermissionCheck' does not exist in the current context

Ces erreurs sont le résultat de la conversion du projet ContosoExpenses.Data d’une bibliothèque .NET Framework (spécifique à Windows) en bibliothèque .NET Standard, qui peut s’exécuter sur plusieurs plateformes, notamment Linux, Android, iOS, etc. Le projet ContosoExpenses.Data contient une classe appelée RegistryService, qui interagit avec le Registre, un concept Windows uniquement.

Pour résoudre ces erreurs, installez le package NuGet de compatibilité Windows, . Ce package prend en charge de nombreuses API spécifiques à Windows à utiliser dans une bibliothèque .NET Standard. La bibliothèque ne sera plus multiplateforme après l’utilisation de ce package, mais elle ciblera toujours .NET Standard.

  1. Cliquez avec le bouton droit sur le projet ContosoExpenses.Data.

  2. Choisissez Gérer les packages NuGet.

  3. Dans la fenêtre du Gestionnaire de paquets NuGet, cliquez sur Parcourir. Recherchez le package Microsoft.Windows.Compatibility et installez la dernière version stable.

    Installer le package NuGet

  4. Réessayez de compiler le projet en cliquant avec le bouton droit sur le projet ContosoExpenses.Data et en choisissant Générer.

Cette fois, le processus de génération se termine sans erreurs.

Tester et déboguer la migration

Maintenant que les projets sont générés avec succès, vous êtes prêt à exécuter et tester l’application pour voir s’il existe des erreurs d’exécution.

  1. Cliquez avec le bouton droit sur le projet ContosoExpenses.Core et choisissez Définir comme projet de démarrage.

  2. Appuyez sur F5 pour démarrer le projet ContosoExpenses.Core dans le débogueur. Vous verrez une exception similaire à ce qui suit.

    exception affichée dans Visual Studio

    Cette exception est levée, car lorsque vous avez supprimé le contenu du fichier .csproj au début de la migration, vous avez supprimé les informations relatives à l’action de génération pour les fichiers image. Les étapes suivantes résolvent ce problème.

  3. Arrêtez le débogueur.

  4. Cliquez avec le bouton droit sur le projet ContosoExpenses.Core et choisissez Décharger le projet. Cliquez à nouveau avec le bouton droit sur le projet, puis choisissez Modifier ContosoExpenses.Core.csproj.

  5. Avant l’élément de fermeture Project, ajoutez l’entrée suivante :

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. Cliquez avec le bouton droit sur le projet ContosoExpenses.Core et choisissez Recharger le projet.

  7. Pour affecter le Contoso.ico à l’application, cliquez avec le bouton droit sur le projet ContosoExpenses.Core , puis choisissez Propriétés. Dans la page ouverte, cliquez sur la liste déroulante sous icône, puis sélectionnez Images\contoso.ico.

    icône Contoso dans les Propriétés du Projet

  8. Cliquez sur Enregistrer.

  9. Appuyez sur F5 pour démarrer le projet ContosoExpenses.Core dans le débogueur. Vérifiez que l’application s’exécute maintenant.

Étapes suivantes

À ce stade du tutoriel, vous avez correctement migré l’application Contoso Expenses vers .NET Core 3. Vous êtes maintenant prêt pour partie 2 : Ajouter un contrôle InkCanvas UWP à l’aide de XAML Islands.

Remarque

Si vous avez un écran haute résolution, vous remarquerez peut-être que l’application semble très petite. Vous allez résoudre ce problème à l’étape suivante du didacticiel.