Fermer

mars 18, 2019

Comment porter des applications de bureau vers .NET Core 3.0


Dans cet article, Olia Gavrysh (responsable de programme, Microsoft) vous guide tout au long du processus de portage d'une application de bureau de .NET Framework vers .NET Core en prenant pour exemple une application WinForms existante.

Cet article était . ] publié à l'origine sur le blog Microsoft .NET et est republié avec autorisation.

Dans cet article, je vais décrire comment porter une application de bureau de .NET Framework à .NET Core. J'ai choisi une application WinForms à titre d'exemple. Les étapes pour l’application WPF sont similaires et je décrirai ce qui doit être fait différemment pour WPF au fur et à mesure. Je montrerai également comment vous pouvez continuer à utiliser le concepteur WinForms dans Visual Studio même s'il est en cours de développement et qu'il n'est pas encore disponible pour les projets .NET Core.

À propos de l'exemple

Pour cet article, j'utiliserai une application de jeu de société Memory-style . Il contient une interface utilisateur WinForms ( MatchingGame.exe ) et une bibliothèque de classes avec la logique du jeu ( MatchingGame.Logic.dll ), tous deux visant .NET Framework 4.5. Vous pouvez télécharger l'exemple ici . Je vais porter le projet d’application sur .NET Core 3.0 et la bibliothèque de classes sur .NET Standard 2.0. L'utilisation de .NET Standard au lieu de .NET Core me permet de réutiliser la logique du jeu pour fournir l'application à d'autres plates-formes, telles qu'iOS, Android ou Web.

Vous pouvez soit regarder Scott Hunter et moi faire la conversion dans la vidéo suivante, soit suivre les instructions pas à pas ci-dessous. Bien sûr, je ne vous en voudrai pas si vous faisiez les deux.

Processus pas à pas

Je suggère d'effectuer la migration dans une branche distincte ou, si vous n'utilisez pas la version. contrôle, en créant une copie de votre projet afin que vous puissiez revenir à un état "propre" si nécessaire.

Avant de transférer l'application vers .NET Core 3.0, vous devez d'abord effectuer une préparation.

Préparation au port [19659010] Installez .NET Core 3 et la version d’aperçu Visual Studio 2019 (Visual Studio 2017 ne prend en charge que jusqu’à .NET Core 2.2).

  • Commencez par une solution opérationnelle . Assurez-vous que la solution s'ouvre, se construit et s'exécute sans problème.
  • Mettez à jour les packages NuGet . Il est toujours recommandé d’utiliser les dernières versions des packages NuGet avant toute migration. Si votre application fait référence à des packages NuGet, mettez-les à jour avec la dernière version. Assurez-vous que votre application est générée avec succès. En cas d'erreur NuGet, rétrogradez la version et repérez la dernière qui n'empêche pas votre code.
  • Exécutez le .NET Portability Analyzer pour déterminer s'il existe des API dans votre application. dépend de ce qui manque dans .NET Core. Dans ce cas, vous devez refactoriser votre code pour éviter les dépendances sur les API, non prises en charge dans .NET Core. Il est parfois possible de trouver une autre API offrant les fonctionnalités requises.
  • Remplacez packages.config par PackageReference . Si votre projet utilise des packages NuGet, vous devez ajouter les mêmes packages NuGet au nouveau projet .NET Core. Les projets .NET Core ne prennent en charge que PackageReference pour l'ajout de packages NuGet. Pour déplacer vos références NuGet de packages.config vers votre fichier de projet, dans l'explorateur de solutions, cliquez avec le bouton droit de la souris sur packages.config -> Migration de packages.config vers PackageReference… .Vous pouvez apprendre. plus d'informations sur cette migration dans l'article Migration de packages.config vers l'article PackageReference .
  • Projet principal de portage

    Créer un nouveau projet

    1. Créer une nouvelle application du même type (Console, WinForms, WPF, Bibliothèque de classes) en tant qu’application que vous souhaitez porter, en ciblant .NET Core 3. À l’heure actuelle, les modèles de démonstration Visual Studio pour les projets de bureau étaient en cours de développement; j’ai donc utilisé la console.
          
       dotnet new winforms -o   MatchingGame.Core  
    2. Dans le fichier de projet, copiez toutes les références externes de l'ancien projet, par exemple:
          
         

          

    3. Construire. À ce stade, si les packages que vous référencez ne prennent en charge que le .NET Framework, vous obtiendrez un avertissement NuGet . Si vous n'avez pas mis à niveau les versions les plus récentes des packages NuGet à l'étape 3, essayez de rechercher si la dernière version prenant en charge .NET Core (.NET Standard) est disponible et effectuez une mise à niveau. S'il n'y a pas de version plus récente, les packages .NET Framework peuvent toujours être utilisés, mais des erreurs d'exécution peuvent survenir si ces packages ont des dépendances sur des API non prises en charge dans .NET Core. Nous vous recommandons d’indiquer à l’auteur du package NuGet que vous voudriez que le package soit mis à jour vers .NET Standard. Vous pouvez le faire via le formulaire Contact sur la galerie NuGet .

    Voie rapide (remplace le fichier de projet existant)

    Commençons par essayer le moyen rapide de mettre en port . . Assurez-vous de disposer d'une copie de votre fichier .csproj actuel. Vous devrez peut-être l'utiliser ultérieurement. Remplacez votre fichier .csproj actuel par le fichier .csproj du projet que vous avez créé à l'étape ci-dessus et ajoutez en haut :

      false 

    Générez votre application. Si vous ne rencontrez aucune erreur – félicitations, vous avez migré votre projet vers .NET Core 3. Pour porter un projet dépendant (interface utilisateur), voir la section Porting UI pour utiliser Designer, consultez . Utilisation de la section Projets de WinForms Designer pour .NET Core .

    Manière lente (portage guidé)

    Si vous rencontrez des erreurs (comme ce fut le cas avec mon application), cela signifie que vous devez effectuer d'autres ajustements. À la place de la méthode rapide décrite ci-dessus, je vais effectuer ici un changement à la fois et donner les solutions possibles à chaque problème. Les étapes ci-dessous vous aideraient également à mieux comprendre le processus de migration. Si vous êtes assez rapide, mais si vous êtes curieux de savoir tous les «pourquoi», continuez votre lecture.

    1. Migration vers le fichier .csproj de style SDK . Pour déplacer mon application vers .NET Core, je dois d'abord modifier mon fichier de projet au format de style SDK car l'ancien format ne prend pas en charge .NET Core. En outre, le format de style SDK est beaucoup plus léger et facile à utiliser. Assurez-vous de disposer d'une copie de votre fichier .csproj actuel. Remplacez le contenu de votre fichier .csproj par le texte suivant. Pour l'application WinForms:
          
        

      WinExe
      net472
      true
      false

      pour l'application WPF:

          

        

      WinExe
      net472
      true
      false

      Notez que j'ai réglé . à false . Dans les projets de nouveau style AssemblyInfo.cs est généré automatiquement par défaut. Donc, si vous avez déjà un fichier AssemblyInfo.cs dans votre projet (alerte spoiler: c'est votre cas), vous devez désactiver la génération automatique ou supprimer le fichier.

      Copiez et collez maintenant toutes les références de l'ancien version du fichier .csproj dans le nouveau fichier. Par exemple:

      Référence du package NuGet

        

      Référence du projet

          
        

      Le projet doit être construit avec succès car il ne s'agit que d'une nouvelle façon d'écrire la même chose. Si vous avez des erreurs, vérifiez bien vos pas.

      Il existe également un outil tiers CsprojToVs2017 permettant d'effectuer la conversion à votre place. Mais après l'avoir utilisé, vous devrez peut-être toujours supprimer certaines références à la main, telles que:

          

        

          

          

    2. Passez de .NET Framework à .NET Standard ou .NET Core . Après avoir converti avec succès ma bibliothèque au format SDK, je peux la recibler. Dans mon cas, je souhaite que ma bibliothèque de classes cible .NET Standard au lieu de .NET Core. Ainsi, il sera accessible depuis n'importe quelle implémentation .NET si je décide d'expédier le jeu sur d'autres plates-formes (telles qu'iOS, Android ou Web Assembly). Pour ce faire, remplacez ceci
          
        net472 

      avec

          

        netstandard2.0 

      Générez votre application. Certaines erreurs peuvent survenir si vous utilisez des API qui ne sont pas incluses dans .NET Standard. Si vous ne recevez aucune erreur avec votre application, vous pouvez ignorer les deux étapes suivantes.

          

    3. Ajoutez le pack de compatibilité Windows si nécessaire . Certaines API qui ne sont pas incluses dans .NET Standard sont disponibles dans le pack de compatibilité Windows . Si vous avez eu des erreurs à l'étape précédente, vous pouvez vérifier si le Pack de compatibilité Windows peut aider. J'ai reçu une erreur «Le nom 'Registre' n'existe pas dans le contexte actuel», alors j'ai ajouté Microsoft. Package Windows.Compatibility NuGet à mon projet. Après l'installation, l'erreur a disparu.
    4. Installez API Analyzer . API Analyzer disponible sous le paquet Microsoft.DotNet.Analyzers.Compatibility de NuGet, vous avertit lorsque vous utilisez des API dépréciées ou qui ne sont pas prises en charge sur toutes les plateformes (Windows, Linux, macOS). Si vous avez ajouté le Compatibility Pack, je vous recommande d’ajouter API Analyzer pour suivre toutes les utilisations d’API qui ne fonctionnent pas sur toutes les plateformes. À ce stade, j’ai terminé avec la migration de la bibliothèque de classes vers .NET Standard. Si vous avez plusieurs projets qui se référencent, migrez-les en commençant par le projet ne dépendant pas d'autres projets. Dans mon exemple, j'ai également un projet WinForms MatchingGame.exe alors maintenant effectuera des opérations similaires pour migrer cela vers .NET Core.

    Portage de l'interface utilisateur

    1. Ajouter un projet d'interface utilisateur .NET Core . Ajoutez un nouveau projet d'interface utilisateur .NET Core 3.0 à la solution. À l'heure actuelle, les modèles Visual Studio pour les projets de bureau sont en cours de développement. Je viens donc d'utiliser la CLI dotnet .
          
       new winforms dotnet -o   MatchingGame.Core  

      Pour les projets WPF, vous utiliseriez ceci:

          

          
       wpf -o  dotnet new  MatchingGame.Core  

      Après la création de mon nouveau projet WinForms .NET Core, je l'ai ajouté à ma solution.

          

          

    2. Projets de liens . Tout d’abord, supprimez tous les fichiers du nouveau projet (pour l’instant, il contient le code générique Hello World). Ensuite, liez tous les fichiers de votre projet d'interface utilisateur .NET Framework existant au projet d'interface utilisateur .NET Core 3.0 en ajoutant ce qui suit dans le fichier .csproj .
          
        
      <Compile Include = ".. ** *. Cs" />
      <EmbeddedResource Include = ".. ** *. resx "/>

      Si vous avez une application WPF, vous devez également inclure les fichiers .xaml :

          

        

      MSBuild: Compile






      MSBuild: Compile



      . ]

          

    3. Aligner l'espace de noms par défaut et le nom de l'assembly . Etant donné que vous créez un lien vers des fichiers générés par le concepteur (par exemple, Resources.Designer.cs ), vous souhaitez généralement vous assurer que la version .NET Core de votre application utilise le même espace de noms et le même nom d'assembly. . Copiez les paramètres suivants à partir de votre projet .NET Framework:
          
       


          

    4. Désactiver AssemblyInfo.cs génération . Comme je l'ai mentionné précédemment, dans les projets d'un nouveau style, AssemblyInfo.cs est généré automatiquement par défaut. En même temps, le fichier AssemblyInfo.cs de l'ancien projet WinForms sera également copié dans le nouveau projet, car j'ai lié tous les fichiers ** *. Cs à l'étape précédente. . Cela entraînera la duplication de AssemblyInfo.cs . Pour l'éviter dans Le fichier de projet MatchingGame.Core I est réglé sur GenerateAssemblyInfo à false .
          
        false   

          

    5. Exécuter un nouveau projet . Définissez votre nouveau projet .NET Core en tant que projet de démarrage et exécutez-le. Assurez-vous que tout fonctionne.
    6. Copiez ou laissez le lien . Désormais, au lieu de lier les fichiers, vous pouvez les copier depuis l'ancien projet d'interface utilisateur .NET Framework vers le nouveau projet d'interface utilisateur .NET Core 3.0. Après cela, vous pouvez vous débarrasser de l'ancien projet.

    Utilisation du concepteur WinForms pour les projets .NET Core

    Comme je l'ai mentionné ci-dessus, le concepteur WinForms pour les projets .NET Core n'est pas encore disponible dans Visual Studio. Toutefois, il existe deux façons de contourner le problème:

    1. Vous pouvez garder vos fichiers liés (en n'effectuant pas l'étape précédente) et les copier lorsque le support du concepteur est disponible. De cette façon, vous pouvez modifier les fichiers de votre ancien projet WinForms .NET Framework à l'aide du concepteur. Et les modifications seront automatiquement répercutées dans le nouveau projet .NET Core WinForms, car elles sont liées.
    2. Vous pouvez avoir deux fichiers de projet dans le même répertoire que votre projet WinForms: l'ancien .csproj . fichier du projet .NET Framework existant et du nouveau fichier .csproj de style SDK du nouveau projet .NET Core WinForms. Il vous suffira de décharger et de recharger le projet avec le fichier de projet correspondant, selon que vous souhaitez utiliser le concepteur ou non.

    Résumé

    Dans cet article de blog, je vous ai montré comment porter une application de bureau contenant plusieurs projets de .NET Framework à .NET Core. En règle générale, il ne suffit pas de recibler vos projets sur .NET Core. J'ai décrit les problèmes potentiels que vous pourriez rencontrer et les moyens de les résoudre. En outre, j'ai montré comment utiliser le concepteur WinForms pour vos applications portées alors qu'il n'est pas encore disponible pour les projets .NET Core.


    Vous souhaitez plus d'informations sur les produits Telerik et .NET Core 3.0?

    Nous espérons que vous avez apprécié en lisant le message d'Olia. L'équipe de Progress Telerik est enthousiasmée par le .NET Core 3.0 et, pour ceux d'entre vous qui utilisent l'interface utilisateur Telerik pour WinForms ou l'interface utilisateur Telerik pour WPF nous souhaitons le rappeler. Cela signifie que les contrôles des deux produits sont compatibles avec .NET Core 3.0. Si vous souhaitez le tester sur vos applications, consultez cet article de blog pour plus d'informations. Happy coding!


    Les commentaires sont désactivés en mode Prévisualisation.




    Source link