Microsoft a annoncé la sortie de .NET 11. La version de cette année permet de développer des applications modernes plus rapidement et de manière plus productive, et apporte des améliorations concernant C# 15, ASP.NET Core, .NET MAUI et le développement sous Windows. Grâce à des centaines d’optimisations du runtime, à des outils SDK plus réactifs et à une réduction de la charge liée aux commandes courantes, vous passez moins de temps à attendre et plus de temps à créer. Cette version permet de créer des applications web et multiplateformes plus riches, tirer parti des nouvelles fonctionnalités du langage C# et explorer le développement basé sur l’IA grâce à des outils améliorés et des capacités « agentiques ».Microsoft .NET ou simplement .NET (prononcé « dot net » est le nom donné à un ensemble de produits et de technologies informatiques de l'entreprise Microsoft pour rendre des applications facilement portables sur Internet. Le but est de fournir un serveur web local permettant de gérer des services et évitant d'externaliser des données privées sur un service web de stockage ou un hébergement web tiers.
Récemment, Microsoft a annoncé la sortie de .NET 11. La version de cette année permet de développer des applications modernes plus rapidement et de manière plus productive, et apporte des améliorations concernant C# 15, ASP.NET Core, .NET MAUI et le développement sous Windows. Grâce à des centaines d’optimisations du runtime, à des outils SDK plus réactifs et à une réduction de la charge liée aux commandes courantes, vous passez moins de temps à attendre et plus de temps à créer. Cette version permet de créer des applications web et multiplateformes plus riches, tirer parti des nouvelles fonctionnalités du langage C# et explorer le développement basé sur l’IA grâce à des outils améliorés et des capacités « agentiques ».
Voici quelques-unes des nouveautés de cette version :
- Les types union et les hiérarchies fermées de C# 15 vous aident à exprimer les états possibles de votre application et à les gérer à l’aide de modèles vérifiés par le compilateur.
- Un hôte CLI AOT natif et un serveur MSBuild « warm » réduisent la charge dans les workflows quotidiens des développeurs.
- ASP.NET Core apporte la validation asynchrone, OpenAPI 3.2 et de nouvelles fonctionnalités pour les applications Blazor et SignalR. Les composants Blazor AI expérimentaux s’intègrent au protocole AG-UI (Agent User Interaction Protocol) pour des expériences Web agentiques avancées.
- Créez des applications agentiques basées sur l’IA avec Microsoft.Extensions.AI (MEAI) pour l’accès aux modèles, MCP pour l’intégration d’outils et Microsoft Agent Framework (MAF) pour les agents et les workflows.
- Mettez à profit les outils de développement agentique avec .NET Skills pour des conseils spécifiques à .NET, .NET MAUI DevFlow pour inspecter et tester les applications en cours d’exécution, et le canevas de mise à niveau .NET pour suivre la progression de la modernisation.
- .NET MAUI adopte CoreCLR comme runtime par défaut et améliore l’itération XAML ainsi que les contrôles natifs.
- Les bibliothèques intègrent désormais la compression Zstandard, simplifient l’exécution des processus, offrent une prise en charge JSON plus complète et proposent de nouvelles façons de travailler avec des données en mémoire sans avoir à les copier au préalable.
Voici la présentation des nouveautés de .NET 11 par Microsoft :
Langages
C# 15
C# 15 est la version de langage par défaut pour les projets ciblant .NET 11. Les types union constituent l’une de ses principales nouveautés : une valeur peut correspondre à l’un des types d’un ensemble déclaré, avec des conversions entre ces types et une vérification d’exhaustivité dans les expressions switch.
Prenons l’exemple d’une recherche de produit qui, soit trouve un produit, soit signale qu’il n’a pas été trouvé :
| Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | ProductLookup result = new Product(42, "Mechanical keyboard"); string message = result switch { Product product => $"Found {product.Name}", ProductNotFound missing => $"No product with ID {missing.Id}", }; Console.WriteLine(message); public sealed record Product(int Id, string Name); public sealed record ProductNotFound(int Id); public union ProductLookup(Product, ProductNotFound); |
Le type de résultat indique à l’appelant les résultats qu’il doit gérer. Il n’est pas nécessaire d’utiliser object ou une classe de base sans rapport simplement pour regrouper ces résultats sous un seul type de retour.
C# 15 introduit également les hiérarchies fermées. Une classe fermée limite la dérivation directe à son assembly de déclaration, fournissant ainsi au compilateur les informations nécessaires pour vérifier les modèles à travers la hiérarchie. Les unions sont utiles lorsque vous souhaitez combiner des types existants ; les hiérarchies fermées conviennent aux modèles dans lesquels vous maîtrisez la relation d’héritage.
Des fonctionnalités linguistiques plus modestes facilitent également l’écriture du code au quotidien. Les arguments d’expression de collection vous permettent de passer des arguments de constructeur ou d’usine sans renoncer à la syntaxe des expressions de collection :
| Code : | Sélectionner tout |
1 2 3 4 | HashSet<string> names = [with(StringComparer.OrdinalIgnoreCase), "Alice", "ALICE", "Bob"]; Console.WriteLine(names.Count); |
Cela affiche 2 : le comparateur contrôle l’égalité, donc « Alice » et « ALICE » constituent une seule entrée.
Parmi les autres ajouts, on trouve les indexeurs d’extension ainsi que les instructions break et continue étiquetées. Ces fonctionnalités ne nécessitent pas la version préliminaire du langage. Les travaux distincts sur la sécurité mémoire restent en phase de préversion.
F# 11
F# 11 améliore l’utilisation de la mémoire par le compilateur et réduit les allocations dans les opérations sur les collections de FSharp.Core. Il ajoute également des moyens de limiter le travail asynchrone concurrent, ce qui est utile lorsqu’une opération sur une collection risquerait sinon de déclencher plus de travail qu’un service ou une machine ne peut en gérer confortablement.
Les notes de mise à jour de F# distinguent les mises à jour du langage de base des fonctionnalités en préversion, notamment la prise en charge de Runtime Async pour les générateurs d’expressions de calcul personnalisés.
Plateforme
SDK
Le SDK active désormais par défaut un hôte CLI AOT natif. Les commandes telles que les requêtes d’aide et de version peuvent s’exécuter sans lancer la CLI gérée, et le lancement d’outils peut également éviter ce chemin de démarrage. Les commandes nécessitant une exécution gérée continuent toutefois de l’utiliser.
Le serveur MSBuild reste également actif par défaut entre les invocations de la CLI, ce qui réduit les opérations de démarrage répétées. Les programmes d’installation du SDK sous Linux et macOS sont plus légers grâce à la déduplication des assemblages.
Les applications basées sur des fichiers peuvent s’étendre à plusieurs fichiers source grâce à #:include, et les filtres de solution peuvent être créés et modifiés depuis la CLI. dotnet watch ajoute l’intégration de l’hôte d’applications Aspire, la récupération après plantage et la sélection de périphériques pour les projets mobiles.
Pour les équipes utilisant Microsoft.Testing.Platform, dotnet test bénéficie désormais de délais d’exécution, de limites d’échecs, de rapports de progression plus clairs et de répertoires de résultats par module. Le choix du moteur de test est important : ces options ne sont pas interchangeables avec les options de ligne de commande de VSTest.
La publication de conteneurs ajoute des résumés d’images reproductibles via SOURCE_DATE_EPOCH et évite les téléchargements redondants de couches lorsque le manifeste cible existe déjà. La configuration de la source NuGet intègre désormais un paramètre définissant l’âge minimum de publication des paquets, ce qui permet aux équipes d’attendre avant que les nouvelles versions de paquets publiées ne soient éligibles à la sélection. Il s’agit d’un contrôle de politique supplémentaire, qui ne remplace pas les vérifications de vulnérabilité ni l’examen des dépendances.
Exécution et performances
Les améliorations apportées aux performances dans .NET 11 concernent à la fois le code que vous déployez et les outils que vous utilisez pour le développer. L’article de Stephen Toub intitulé « Améliorations des performances dans .NET 11 » passe en revue de manière détaillée des centaines d’optimisations au niveau de l’exécution et des bibliothèques, avec des benchmarks et des exemples de code.
Les améliorations apportées au compilateur « just-in-time » (JIT) suppriment davantage de vérifications de limites et de branchements redondants, améliorent la dévirtualisation et regroupent davantage d’opérations en constantes. Par exemple, le JIT peut optimiser des appels SequenceEqual supplémentaires lorsqu’il connaît les entrées au moment de la compilation. Ces modifications améliorent le code généré sans que vous ayez à réécrire la logique d’application correspondante.
Le dispatch d’interface AOT natif utilise un assistant partagé qui réduit le code nécessaire aux emplacements d’appel d’interface et améliore le débit pour les charges de travail faisant un usage intensif des interfaces. La prise en charge matérielle s’étend également, notamment avec les instructions FP16 pour les opérations Half sur le matériel x64 et Arm64 pris en charge, ainsi que de nouvelles API de construction et de composition vectorielles.
Des travaux utiles ont également été menés en matière de diagnostics. La journalisation des rapports de plantage en cours de traitement permet de capturer une trace de pile gérée, des informations sur les modules et l’état d’exécution avant la fermeture d’un processus. Auparavant disponible sur les plateformes mobiles, ce mécanisme de rapport prend désormais également en charge Linux et macOS.
Comme toujours, évaluez l’impact sur votre propre application. Le débit, le temps de démarrage, l’utilisation de la mémoire et la taille du déploiement dépendent de la charge de travail et des options de publication que vous choisissez.
Runtime Async a été un thème récurrent tout au long des préversions de .NET 11. Il déplace la suspension et la reprise asynchrones vers le runtime au lieu de s’appuyer sur des machines à états générées par le compilateur.
L’un des résultats particulièrement utiles est une pile d’appels en temps réel plus claire. Les profileurs et les débogueurs peuvent afficher les méthodes asynchrones elles-mêmes au lieu de l’infrastructure utilisée pour les exécuter. Cela se distingue des traces de pile d’exceptions, qui masquent déjà une grande partie de cette infrastructure.
Runtime Async reste une fonctionnalité en préversion. Pour l’essayer dans un projet ciblant net11.0, ajoutez :
| Code : | Sélectionner tout |
1 2 3 | <PropertyGroup>
<Features>runtime-async=on</Features>
</PropertyGroup> |
vous n’avez pas besoin d’activer EnablePreviewFeatures dans ce scénario. Les bibliothèques du runtime .NET sont elles-mêmes construites avec Runtime Async, mais le choix d’intégrer le code de votre application dans le nouveau modèle de compilation est une décision distincte.
Bibliothèques et outils d’IA
Le SDK .NET 11 inclut un modèle de serveur MCP. MCP offre aux applications d’IA un moyen commun de découvrir et d’appeler des outils et des services. Le modèle utilise le SDK C# officiel de MCP et inclut un exemple d’outil fonctionnel, ce qui vous permet de commencer à exposer vos propres fonctionnalités sans avoir à installer au préalable un package de modèle distinct :
| Code : | Sélectionner tout |
dotnet new mcpserver -o MyMcpServer
Pour les applications qui utilisent des services d’IA, Microsoft.Extensions.AI (MEAI) fournit des abstractions telles que IChatClient et IEmbeddingGenerator. Ces bibliothèques vous permettent de composer l’accès aux modèles à l’aide de l’injection de dépendances, de la mise en cache et d’OpenTelemetry en utilisant des modèles .NET familiers. Elles sont disponibles sous forme de packages NuGet, et non pas en tant que fonctionnalités vous obligeant à migrer l’intégralité du code de votre application vers une nouvelle version du framework.
Microsoft Agent Framework (MAF) s’appuie sur ces abstractions avec des agents qui appellent des outils et gèrent l’état de la conversation, ainsi que des workflows qui coordonnent les agents et le code de l’application. Connectez des agents aux outils MCP pour leur donner accès aux capacités de votre application, et exposez un agent via un point de terminaison ASP.NET Core AG-UI pour créer une expérience Blazor interactive. L’intégration d’hébergement AG-UI est actuellement en préversion.
Bibliothèques
Les bibliothèques .NET ajoutent des fonctionnalités qui nécessitaient auparavant une configuration supplémentaire, des tampons intermédiaires ou des aides personnalisées.
L’extension de l’API Process inclut des méthodes à exécution unique permettant de lancer un processus et de capturer sa sortie ainsi que son état de sortie. Des API plus avancées vous permettent de contrôler les descripteurs hérités, les démarrages suspendus et la signalisation des processus. Les outils de compilation et les utilitaires de développement peuvent consacrer moins de code à la gestion des processus tout en continuant à vérifier comment un processus fils s’est terminé. Consultez la section « Améliorations de l’API Process dans .NET 11 » pour des exemples.
La compression Zstandard vient s’ajouter aux formats de compression existants dans System.IO.Compression. De nouvelles API de compression basées sur des intervalles prennent en charge les appelants qui gèrent leurs propres tampons, et les améliorations apportées au format ZIP incluent la validation CRC32 lors de la lecture des entrées.
Quatre nouveaux adaptateurs de flux en mémoire permettent de relier les données existantes à des API acceptant un flux : ReadOnlyMemoryStream, WritableMemoryStream, ReadOnlySequenceStream et StringStream. Par exemple, un ReadOnlySequence<byte> segmenté d’un pipeline peut être lu sous forme de flux sans avoir à le « aplatir » au préalable dans un nouveau tampon contigu.
System.Text.Json ajoute la prise en charge des unions C#, des unions discriminées F# et de la sortie JSON Lines à partir de séquences asynchrones. La prise en charge des unions F# utilise la réflexion et ne prend pas en charge la génération de code source, le rognage ni l’AOT natif ; vérifiez donc les limites documentées avant de l’utiliser pour une application allégée.
LINQ ajoute FullJoin, qui conserve les éléments non appariés des deux entrées. Cela s’avère utile pour les opérations de rapprochement, telles que la comparaison de deux inventaires où vous devez identifier les articles manquants de part et d’autre.
Les bibliothèques étendent également les types numériques, la résolution DNS, la cryptographie et la configuration du traçage. La présentation des bibliothèques couvre l’ensemble complet des modifications et signale les API qui restent expérimentales.
Entity Framework Core 11
Entity Framework Core 11 améliore la manière dont votre modèle est converti en requête et dont cette requête est convertie en SQL.
EF Core supprime les jointures inutiles dans davantage de scénarios de navigation par référence et de requêtes fractionnées, améliore la traduction de GroupBy et traduit le nouvel opérateur LINQ FullJoin sur les fournisseurs relationnels qui le prennent en charge. Ces modifications permettent de simplifier le code SQL généré tout en conservant davantage de requêtes dans LINQ.
Les types complexes et les colonnes JSON peuvent désormais être utilisés sur des entités mappées avec un héritage de type « table par type » ou « table par type concret ». Parmi les autres améliorations, citons les outils de migration et des fonctionnalités JSON supplémentaires spécifiques aux fournisseurs.
Pour les applications SQL Server, EF Core ajoute la prise en charge des index vectoriels et de la recherche vectorielle approximative. Les fonctionnalités SQL Server et les API EF correspondantes sont expérimentales.
EF Core 11 nécessite .NET 11. Lors de la mise à niveau, vérifiez la compatibilité de votre fournisseur de base de données, les modifications rompant la compatibilité d’EF Core 11 ainsi que les changements apportés au runtime.
Outils de développement
Le nouveau gestionnaire de chaînes d’outils dotnetup vous permet d’installer et de mettre à jour les SDK et les runtimes .NET dans votre compte utilisateur. Il est actuellement en préversion publique et vous aide à gérer les versions en parallèle et à rester à jour avec les mises à jour de maintenance.
.NET Skills fournit aux agents de codage des conseils spécifiques à chaque tâche, prodigués par l’équipe .NET. Notre présentation de .NET Skills explique comment ajouter ces compétences à votre agent de codage.
La boîte à outils expérimentale .NET MAUI DevFlow expose l’arborescence visuelle d’une application en cours d’exécution, des captures d’écran et des outils d’interaction, afin qu’un agent puisse inspecter et tester l’interface utilisateur plutôt que de travailler uniquement à partir du code source.
Pour la modernisation, le canevas .NET Upgrade vous offre une vue visuelle d’une session de mise à niveau GitHub Copilot. Examinez les résultats de l’évaluation et la compatibilité des dépendances, suivez les tâches de mise en œuvre et surveillez les échecs et la progression au fur et à mesure que l’agent de mise à niveau travaille.
Charges de travail
Web : ASP.NET Core et Blazor
Les types d’application sont particulièrement utiles lorsque le reste de la pile les prend en charge. ASP.NET Core prend en charge les unions C# partout où il utilise System.Text.Json, y compris dans les corps de requêtes et de réponses JSON des API minimales et de MVC. Les documents OpenAPI générés décrivent les alternatives de l’union à l’aide d’un schéma « anyOf ».
Cette prise en charge s’applique aux corps JSON, et non au routage, aux requêtes, aux en-têtes ou au liaison de formulaires. Lorsque plusieurs cas d’union présentent la même structure JSON, configurez un classificateur afin que la désérialisation puisse les distinguer. La documentation sur les unions dans ASP.NET Core explique ces limites.
La validation devient également plus pratique pour les règles nécessitant des opérations d’E/S. La validation asynchrone fonctionne avec les nouvelles API DataAnnotations asynchrones ; ainsi, un validateur peut attendre le résultat d’une recherche dans la base de données ou d’un appel distant au lieu de bloquer un thread. Les API minimales et les formulaires Blazor peuvent bénéficier de cette prise en charge.
OpenAPI 3.2 est désormais la version par défaut pour les documents générés. Parmi d’autres améliorations, elle permet au document de décrire la charge utile par événement d’un flux d’événements envoyés par le serveur. Si un générateur client ou un autre élément de votre chaîne d’outils ne prend pas encore en charge la version 3.2, vous pouvez sélectionner explicitement une version antérieure du document.
Pour les connexions de longue durée, l’actualisation de l’authentification SignalR permet à une connexion de rafraîchir l’authentification sans se reconnecter. Les composants Blazor Interactive Server peuvent recevoir l’identité mise à jour et réagir lorsque les revendications changent.
Blazor...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.