Microsoft cherche depuis quelques années maintenant à unifier et à étendre la plateforme .NET. Richard Lander, Program Manager au sein de l'équipe .NET, a expliqué que Microsoft a fait un pas vers cet objectif avec .NET Core, l'unification était censée être matérialisée avec .NET 5 avec un lancement en novembre 2020. Mais la pandémie du coronavirus ainsi que d'autres problèmes survenus au cours de l'année ont eu raison de ce calendrier.
L’entreprise a publié la quatrième Preview de .NET 6 en mai dernier. Elle a également indiqué que .NET 6 sera lancée en novembre 2021 et représente l'aboutissement d'un effort de plusieurs années visant à fournir un framework multiplateforme à code source libre pour tout ce qui concerne .NET dans une offre globale unifiée. Dans .NET 6, l'équipe de développement se concentrera spécifiquement sur les performances des applications, l'ajout de nouveaux thèmes de contrôle et l'accélération des expériences des développeurs. Voici, ci-dessous, quelques nouveautés apportées par .NET 6 Preview 5 :
Bibliothèques : JsonSerializer Génération de sources
L'épine dorsale de presque tous les sérialiseurs .NET est la réflexion. La réflexion est une excellente capacité pour certains scénarios, mais pas comme base d'applications cloud-native hautes performances (qui (dé)sérialisent et traitent généralement beaucoup de documents JSON). La réflexion est un problème pour le démarrage, l'utilisation de la mémoire et l'optimisation de l'assemblage.
L'alternative à la réflexion à l'exécution est la génération de sources à la compilation. Les générateurs de sources génèrent des fichiers source C# qui peuvent être compilés dans le cadre de la construction de la bibliothèque ou de l'application. La génération du code source au moment de la compilation peut offrir de nombreux avantages aux applications .NET, notamment une amélioration des performances.
Dans .NET 6, Microsoft inclut un nouveau générateur de sources dans System.Text.Json. Le générateur de sources JSON fonctionne conjointement avec JsonSerializer et peut être configuré de plusieurs façons. Il offre les avantages suivants :
- réduire le temps de démarrage ;
- améliorer le débit de sérialisation ;
- réduire l'utilisation de la mémoire privée ;
- permet une sérialisation JSON compatible avec les trimestres ;
- suppression de l'utilisation à l'exécution de System.Reflection et System.Reflection.Emit.
SDK .NET : Améliorations des charges de travail
Les charges de travail du SDK sont une nouvelle fonctionnalité du SDK .NET qui nous permet d'ajouter la prise en charge de nouveaux types d'applications, comme les applications mobiles et WebAssembly, sans augmenter la taille du SDK. La fonctionnalité des charges de travail a été mise à jour pour inclure des verbes de liste et de mise à jour. Ces nouvelles fonctionnalités donnent un aperçu de l'expérience finale attendue.
- dotnet workload list vous indiquera les charges de travail que vous avez installées ;
- dotnet workload update met à jour toutes les charges de travail installées avec la dernière version disponible.
Les commandes dotnet workload fonctionnent dans le contexte du SDK donné. Imaginez que vous ayez installé à la fois .NET 6 et .NET 7. Si vous utilisez les deux, les commandes de charges de travail fourniront des résultats différents puisque les charges de travail seront différentes (du moins des versions différentes des mêmes charges de travail). Les charges de travail ont été introduites pour la première fois dans la version .NET 6 preview 4.
SDK .NET : Validation des paquets NuGet
L'outil de validation des paquets permet aux développeurs de bibliothèques NuGet de vérifier que leurs paquets sont cohérents et bien formés. Cela comprend :
- valider qu'il n'y a pas de changement de rupture entre les versions ;
- déterminer toute lacune dans l'applicabilité du cadre cible ou du runtime ;
- valider que le paquet a le même ensemble d'API publiques pour toutes les implémentations spécifiques à l'exécution.
Bibliothèques : Suppression du support pour les anciens frameworks
Selon Microsoft, l'abandon d'un framework dans un paquet est un changement qui casse la source. Dans le même temps, continuer à construire pour tous les frameworks livrés augmente la complexité et la taille d'un paquet.
Pendant la construction, l'utisateur télécharge la version précédente du paquet et avec les binaires pour les anciens frameworks pour lesquels on ne construit plus. Cela signifie que l’utilisateur ne recevra jamais de corrections de bogues ou de nouvelles fonctionnalités s’il exploite un binaire téléchargé. En d'autres termes, les ressources téléchargées ne peuvent pas être entretenues, ce qui est maintenant caché, car, du point de vue de l’utilisateur, il peut continuer à mettre à jour le paquet vers une version ultérieure même s’il exploite le même vieux binaire qui n’est plus mid à jour.
À partir du Preview 5 de .NET 6, prévois de ne plus effectuer aucune forme de moissonnage pour garantir que tous les actifs qu’elle livre peuvent être pris en charge. Cela signifie qu’elle abandonne la prise en charge de tout framework plus ancien que ceux-ci :
- .NET Framework 4.6.1 ;
- .NET Core 3.1 ;
- .NET Standard 2.0.
Si l’utilisateur fait actuellement référence à un package impacté d'un framework antérieur, il ne pourra plus mettre à jour le package référencé vers une version ultérieure. Les utilisateurs ont le choix entre recibler le projet sur une version plus récente du framework ou ne pas mettre à jour le paquet référencé.
Génération d'une logique de sérialisation optimisée
Par défaut, le générateur de sources JSON émet une logique de sérialisation pour les types sérialisables donnés. Cela permet d'obtenir de meilleures performances qu'en utilisant les méthodes JsonSerializer existantes en générant un code source qui utilise directement Utf8JsonWriter. En bref, les générateurs de sources offrent un moyen de donner une implémentation différente à la compilation afin d'améliorer l'expérience à l'exécution.
Si l'on fait un zoom arrière, JsonSerializer est un outil qui possède de nombreuses fonctionnalités permettant d'améliorer la (dé)sérialisation des types .NET depuis/vers le format JSON. Il est rapide, mais peut avoir une certaine surcharge de performance lorsque seul un sous-ensemble de fonctionnalités est nécessaire pour une routine de sérialisation.
Étant donné un type simple :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 | namespace Test { internal class JsonMessage { public string Message { get; set; } } } |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | using System.Text.Json.Serialization; namespace Test { [JsonSerializable(typeof(JsonMessage)] internal partial class JsonContext : JsonSerializerContext { } } |
Dans le cadre de la construction, le générateur de sources augmente la classe partielle JsonContext avec la forme suivante :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | internal partial class JsonContext : JsonSerializerContext { public static JsonContext Default { get; } public JsonTypeInfo<JsonMessage> JsonMessage { get; } public JsonContext(JsonSerializerOptions options) { } public override JsonTypeInfo GetTypeInfo(Type type) => ...; } |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | using MemoryStream ms = new(); using Utf8JsonWriter writer = new(ms); JsonContext.Default.JsonMessage.Serialize(writer, new JsonMessage { "Hello, world!" }); writer.Flush(); // Writer contains: // {"Message":"Hello, world!"} |
Code : | Sélectionner tout |
1 2 3 | JsonSerializer.Serialize(jsonMessage, JsonContext.Default.JsonMessage); Here’s a similar use, with a different overload. JsonSerializer.Serialize(jsonMessage, typeof(JsonMessage), JsonContext.Default); |
Le générateur de sources émet également une logique d'initialisation des métadonnées de type qui peut également bénéficier à la désérialisation. Pour désérialiser une instance de JsonMessage en utilisant les métadonnées de type prégénérées, vous pouvez procéder comme suit :
Code : | Sélectionner tout |
1 2 3 | JsonSerializer.Deserialize(json, JsonContext.Default.JsonMessage); Similar to serialization above, you might also write: JsonSerializer.Deserialize(json, typeof(JsonMessage), JsonContext.Default); |
Source : Microsoft
Et vous ?
Avez-vous effectué la migration vers .NET 6 Preview 5 ? Quels changements avez-vous rencontrés (difficultés, améliorations des performances, etc.) ?
Voir aussi :
Microsoft annonce la disponibilité de .NET 6 Preview 4 qui apporte l'expérience Hot Reload à Visual Studio et aux outils de ligne de commande
Microsoft annonce la disponibilité de l'expérience .NET Hot Reload dans Visual Studio 2019 version 16.11 (Preview 1) et via les outils de ligne de commande dans .NET 6 (Preview 4)
État de .NET : C# est le principal langage utilisé par 95 % des développeurs .NET et ASP.NET Web API vient en tête des modèles d'applications utilisés dans la communauté
Depuis qu'il a effectué une migration vers .NET 5.0, le développeur de la bibliothèque .NET Fusion, a constaté une nette amélioration des performances