Cela fait vingt ans que le framework .NET est apparu pour la première fois. Depuis avril 2019, il a été gelé dans .NET Framework 4.8 et .NET (anciennement .NET Core) l’a remplacé.
À partir de .NET Framework 4.5.2, Microsoft a annoncé que .NET Framework serait lié au cycle de vie du système d’exploitation. Pour Windows 10, cela signifie que son cycle de vie se terminera en octobre 2025. Cependant, Windows 11 inclut .NET Framework 4.8, il n’y a donc pas d’urgence à passer à .NET 6.
Si vous développez des logiciels en C#, vous avez le choix : devez-vous rester avec .NET Framework ou passer à .NET ?
Deux scénarios à envisager
Scénario 1 : Travail Web : Toutes les innovations et améliorations sont désormais en .NET. C’est là que vous trouverez Blazor, SignalR, Microservices et ASP.NET Core. Cependant, les différences sont assez mineures, car .NET Core (le précurseur de .NET) existe depuis un certain temps et l’outil d’assistant de mise à niveau effectuera la conversion. Avec tout cela à l’esprit, passons à:
Scénario 2 : Travail de bureau : WinForms et WPF peuvent s’exécuter sur .NET, mais uniquement sur Windows, pas Linux ou Mac. Si vous avez une application .NET Framework existante que vous souhaitez exécuter sur .NET, elle devra être convertie à l’aide d’un assistant de mise à niveau fourni par Microsoft (plus à ce sujet plus tard). Les applications console fonctionnent bien sur Linux et Mac.
Une autre différence réside dans les versions de C#. Les nouvelles versions de C# n’apparaissent que dans .NET, la plus récente étant C# 11 (actuellement en version préliminaire), tandis que .NET Framework 4.8 est définitivement bloqué à C# 7.3. Il est possible d’installer C# 8.0 sur .NET Framework (comme l’explique cette question Stack Overflow), mais certaines nouvelles fonctionnalités telles que les nouveaux attributs nullables ne sont pas prises en charge.
WinForms sur .NET
Au fil des ans, j’ai développé pas mal d’applications WinForms ; en théorie, ils devraient également fonctionner en .NET. Cependant, j’ai trouvé que le concepteur est en quelque sorte un travail en cours et prend parfois beaucoup de temps à s’ouvrir. Il a été entièrement repensé dans .NET 6, comme l’explique ce billet de blog Microsoft. Il ne semble pas aussi rapide que le concepteur sur .NET Framework.
Dans le cadre de cet article, j’ai créé un formulaire simple dans un projet .NET Framework et le même dans .NET 6, tous deux utilisant le Visual Studio 2022 le plus récent sur Windows 11.
System.Drawing
Si votre application WinForms effectue un traitement graphique quelconque, il est probable qu’elle utilise System.Drawing. Cela permet d’accéder à la fonctionnalité graphique Windows GDI+. Si vous commencez à développer pour Linux avec .NET, vous remarquerez que l’espace de noms System ne contient plus Drawing. C’était l’un des changements de rupture annoncés dans les notes pour .NET 6 (vous pouvez lire à ce sujet).
Essayez d’exécuter une application à l’aide de System.Drawing sur Linux ou Mac et vous obtiendrez cette exception : “System.Drawing.Common n’est pas pris en charge sur les plates-formes autres que Windows”. Il existe un commutateur de configuration qui vous permet de masquer cette exception sur .NET 6, mais elle sera supprimée dans .NET 7. Microsoft vous suggère de basculer vers l’une des bibliothèques ImageSharp, SkiaSharp ou Microsoft.MAUI.Graphics.
J’ai converti une application pour utiliser SkiaSharp pour générer une image Bitmap dans la RAM, puis l’enregistrer sur le disque en tant que fichier .png. Il a fonctionné sans problème sur Windows et Linux (Ubuntu 22.04) ; mais changer de bibliothèque est assez pénible et prendra quelques jours ou quelques semaines. Il n’y a pas de conversion facile, car le code graphique doit être réécrit.
Assistant de mise à niveau
Il s’agit d’un outil de ligne de commande gratuit créé par Microsoft pour la mise à niveau des projets .NET Framework vers .NET 6. Il gère non seulement les projets WinForms et WPF, mais également les projets UWP, les applications console, les sites Web ASP.NET MVC et les bibliothèques de classes .NET Framework. Cela fonctionne pour les projets C# et VB.NET. Un tutoriel sur l’assistant de mise à niveau a été fourni par Microsoft.
Une fois installé, vous pouvez analyser ou mettre à jour le projet. L’exécution de la commande analyze produit un fichier au format .sarif. Il s’agit de l’abréviation de Static Analysis Results Interchange Format. Une visionneuse Sarif gratuite est disponible ici pour Visual Studio et une extension pour VS Studio Code. Il sort ceci :
[20:11:27 INF] Exécution d’analyseurs sur WinFormsAppFramework
[20:11:28 INF] Identifié 0 diagnostics dans le projet WinFormsAppFramework
[20:11:28 WRN] HighDpiMode doit être défini dans Main() au lieu de app.config ou app.manifest – Application.SetHighDpiMode(HighDpiMode.
). Il est recommandé d’utiliser SystemAware comme option HighDpiMode pour de meilleurs résultats. [20:11:28 INF] Analyse terminée, le rapport est disponible sur … (coupé).
L’exécution de l’assistant avec mise à niveau affiche une série d’étapes, en commençant par la sauvegarde du projet. Ensuite, il suffit d’appuyer sur 1 pour passer à l’étape suivante ou sur 2 pour l’annuler. Lorsque mon projet a été converti, la seule différence que j’ai remarquée dans le code était que la méthode Main() avait l’appel suivant ajouté :
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Il a été compilé et exécuté sans problème.
Conclusion
Devoir mettre à niveau avec l’assistant signifie que c’est probablement quelque chose que vous ne ferez que lorsque vous en aurez vraiment besoin, en particulier s’il utilise System.Drawing. J’ai le sentiment que de nombreux logiciels WinForms et WPF resteront sur le .NET Framework pendant quelques années. Les avantages de pouvoir créer des applications pour Linux et Mac ne se produiront pas s’il utilise WinForms/WPF pour l’interface utilisateur.
Si vous souhaitez développer une application GUI C# pour Linux ou Mac, vous aurez besoin d’une bibliothèque alternative. Il y en a plusieurs autour (Uno, Avalonia et autres), alors explorez ce qui fonctionne pour vous.