C# Hebdo #2 : C# Dev Kit 11.0 bascule sur Native AOT, MSTest 4.5 unifie les tests WinUI/UWP, C# 15 intègre les types union dans ASP.NET Core

C# · Weekly #2

C# Hebdo #2 : C# Dev Kit 11.0 bascule sur Native AOT, MSTest 4.5 unifie les tests WinUI/UWP, C# 15 intègre les types union dans ASP.NET Core

csharpC#hebdoNative AOTC# Dev Kit

Sources:GitHub Releases + 官方博客 + HN

📦 Actualités des versions

Évolution des versions stables et validation des pipelines de build

La version stable officielle la plus récente est .NET 10.0.12 (publiée le 8 septembre 2026, incluant les SDK 10.0.401 et 10.0.112). Si vos équipes maintiennent des systèmes en production ou préparent une mise à niveau globale, vous pouvez consulter notre précédent décryptage des fonctionnalités de C# 14 pour faire le point sur les évolutions du langage et du runtime.

Dans le même temps, .NET 11 Release Candidate 1 (RC 1) bénéficie d’une licence commerciale « Go-Live » autorisant son utilisation en production. La RC 2 est attendue sous peu, avant la disponibilité générale (GA) prévue lors de la conférence .NET Conf 2026 en novembre.

Voici les évolutions majeures intervenues au niveau du runtime et de la chaîne de dépendances :

DomaineÉvolution de la règleImpact concret en production
Extension de la couverture PGO dynamique du JITÉlargissement des points d’intervention de la compilation multiniveau (Tiered Compilation) et du PGO dynamique, améliorant l’inlining des appels virtuels d’interfaces.Le débit des microservices sollicitant intensivement des interfaces et délégués progresse de 8 % à 12 %, avec une baisse nette de la gigue de latence au P99.
Périmètre fonctionnel de C# 15 figéLes types union natifs (Union Types), le pattern matching enrichi et la syntaxe de déconstruction entrent en phase de stabilisation ; le compilateur Roslyn gèle toute modification de rupture.Les codes répétitifs (boilerplate) liés aux agrégats du Domain-Driven Design (DDD) et aux machines à états sont considérablement réduits.
Renouvellement du certificat de signature d’auteur NuGetLa signature officielle des packages adopte une nouvelle empreinte X.509 ; l’ancien certificat ne signe plus les nouvelles versions.Les pipelines CI d’entreprise imposant la validation des signatures doivent intégrer la nouvelle empreinte sous peine de blocage par l’erreur NU3034.

📝 Décryptage

1. Refonte complète de C# Dev Kit 11.0 : un binaire Native AOT unique accélère le chargement jusqu’à 180 fois

Ce qui s’est passé : Le 6 octobre, l’équipe d’outils de développement de Microsoft a publié la préversion de C# Dev Kit 11.0, alignant directement sa numérotation sur celle de .NET 11 (succédant à la version 3.3). Cette mise à jour réécrit entièrement l’architecture sous-jacente de l’extension en fusionnant les six processus managés d’arrière-plan en un seul binaire natif compilé en Native AOT, nommé CSDevKit. Le système intègre également un cache de projet persistant et une stratégie de chargement prioritaire des fichiers actifs.

Pourquoi c’est important : L’ancien modèle multiprocessus imposait à chaque processus de subir les analyses antivirus du système d’exploitation, de charger des images managées depuis le disque et d’exécuter des compilations JIT au démarrage, provoquant de fortes latences sur les solutions complexes. Selon les benchmarks officiels réalisés sur la solution microsoft/aspire (407 projets, 4 686 fichiers C#), le délai pour obtenir l’autocomplétion et les diagnostics sur le fichier actif est passé de 84,1 secondes à seulement 0,47 seconde (une accélération de 180 fois). Le chargement complet de la solution a été ramené de 84,1 à 3,0 secondes (28 fois plus rapide), tandis que l’empreinte mémoire résidente a chuté de 2 072 Mo à 316 Mo (soit 85 % d’économie). Sur dotnet/orleans (155 projets), la disponibilité du fichier actif est passée de 50,3 à 0,53 seconde (95 fois plus rapide) et la mémoire a baissé de 1 307 Mo à 208 Mo (réduction de 84 %). Côté compilation incrémentale, le build sans modification est passé de 34,4 à 0,88 seconde (39 fois plus rapide), et celui avec modification d’un fichier est passé de 36,1 à 2,1 secondes (17 fois plus rapide). En outre, l’extension apporte le support natif de la complétion et des diagnostics pour les fichiers MSBuild (.csproj, .props, .targets) ainsi que l’outil de diagnostic de configuration C# Doctor.

Qui est concerné : Les développeurs travaillant sur des éditeurs légers comme VS Code ou Cursor, ainsi que les agents de codage IA qui indexent les espaces de travail et interrogent les serveurs de langage de manière massivement parallèle.

Lien source : A faster, lighter C# Dev Kit


2. MSTest 4.5 et MTP 2.5 : répartiteur UI unifié et sécurisation des canaux pour WinUI 3 et UWP

Ce qui s’est passé : Le 5 octobre, l’équipe .NET a livré MSTest 4.5 et Microsoft.Testing.Platform (MTP) 2.5, inaugurant une architecture de test unifiée pour les applications de bureau WinUI 3 et UWP. La nouvelle version introduit l’attribut natif [UITestMethod], directement relié au répartiteur DispatcherQueue de la fenêtre réelle, s’affranchissant ainsi des dépendances historiques envers Microsoft.NET.Test.Sdk, vstest.console et les runtimes de déploiement spécifiques à Visual Studio.

Pourquoi c’est important : Les tests d’interface graphique de bureau exigent que l’initialisation des tests, l’exécution asynchrone et le nettoyage des ressources se déroulent obligatoirement sur le véritable thread UI. Les threads d’arrière-plan STA classiques ne pouvaient pas fournir une file de répartition adéquate. MSTest.Sdk introduit un contrôleur sidecar léger qui achemine automatiquement l’exécution selon la typologie du projet : les applications non packagées (Unpackaged) sont lancées directement en processus, tandis que les applications packagées ou isolées en bac à sable (AppContainer) sont activées par le contrôleur via leur AUMID. Pour l’isolation AppContainer, les canaux de communication du sidecar excluent les permissions globales génériques et n’autorisent strictement que le SID du package ciblé pour les rapports de test, les signaux d’annulation et la collecte des dumps de blocage. Pour Modern UWP (UseUwp), le framework prend en charge la compilation native via PublishAot=true, garantissant une stricte conformité entre l’environnement de test et le binaire natif déployé en production.

Qui est concerné : Les développeurs d’applications clientes Windows et les équipes d’infrastructure logicielle automatisant des suites de validation UI au sein de conteneurs CI/CD headless.

Lien source : UWP and WinUI 3 apps: UI testing with MSTest


3. Types union natifs dans C# 15 : prise en charge complète dans ASP.NET Core

Ce qui s’est passé : L’équipe d’architecture .NET a dévoilé son plan d’intégration des types union natifs (Union Types) de C# 15 au sein de l’écosystème web. Sur le plan syntaxique, les développeurs peuvent déclarer des structures comme public union IntOrString(int, string); et les manipuler directement comme valeurs de retour de routes ou charges utiles de requêtes dans ASP.NET Core Minimal APIs, les contrôleurs MVC, SignalR et Blazor.

Pourquoi c’est important : Dans les spécifications modernes d’API, il est fréquent qu’un champ admette plusieurs types de données distincts, à l’image du paramètre maxUnavailable de Kubernetes qui accepte indifféremment un entier ou une chaîne de pourcentage. Auparavant, modéliser ce comportement en C# nécessitait des types conteneurs génériques volumineux, des opérateurs de conversion implicite ou l’usage de types object bruts avec réflexion, ce qui générait du boilerplate et des allocations sur le tas. Les types union natifs de C# 15 bornent l’ensemble des types admissibles dès la compilation, appliquent des conversions implicites sans perte et garantissent l’exhaustivité des branches via les expressions switch. Au niveau de la couche réseau, System.Text.Json produit des analyseurs de désérialisation sans aucune réflexion et génère automatiquement des schémas OpenAPI conformes à oneOf, éliminant le besoin de DTOs intermédiaires.

Qui est concerné : Les ingénieurs backend concevant des APIs web à très haute fréquence et les architectes définissant des contrats d’échange de données polymorphes entre microservices.

Lien source : Use C# unions and closed hierarchies in ASP.NET Core


4. Renouvellement obligatoire du certificat de signature NuGet : stratégie de défense pour la CI d’entreprise

Ce qui s’est passé : Fin septembre, l’équipe officielle de NuGet a enclenché le renouvellement de son certificat X.509 de signature d’auteur. La nouvelle empreinte SHA-256 par défaut est 9A1B131BEE0605433056A4EA3815478A8E177961A968C6C0027C1093D1FEB630, remplaçant l’ancienne empreinte historique 566A31882BE208BE4422F7CFD66ED09F5D4524A5994F50CCC8B05EC0528C1353.

Pourquoi c’est important : Si les packages déjà publiés restent vérifiables avec l’ancien certificat, toutes les nouvelles dépendances officielles publiées seront signées avec cette nouvelle clé de chiffrement. Dans les entreprises appliquant des règles strictes de sécurité de la chaîne logicielle, les agents de build activent la directive signatureValidationMode="require" dans nuget.config ou exécutent des vérifications via dotnet nuget verify. Si la nouvelle empreinte n’a pas été déclarée dans la chaîne CI/CD, le téléchargement des packages officiels récents déclenchera immédiatement l’exception bloquante NU3034. Les équipes doivent ajouter la nouvelle empreinte via la commande dotnet nuget trust author Microsoft 9A1B131BEE0605433056A4EA3815478A8E177961A968C6C0027C1093D1FEB630 --algorithm SHA256, tout en conservant l’ancienne empreinte pour assurer la restauration sans heurt des versions antérieures.

Qui est concerné : Les équipes de sécurité d’infrastructure, les ingénieurs DevOps en charge des pipelines de compilation et les administrateurs de miroirs privés NuGet.

Lien source : Microsoft is updating its author-signing certificate


🔥 Tendances de la communauté

1. Refonte de C# Dev Kit 11.0 : performances saluées et controverse autour du Solution Explorer

La communauté r/dotnet sur Reddit a engagé un débat fourni autour du rapport de performances publié par l’ingénieur Microsoft Drew Noakes (191 points, 93 commentaires, relayé sur Hacker News avec 4 points).

Points de divergence majeurs :

  • Partisans des gains de performances et de l’intégration des agents : Les développeurs ont chaleureusement salué la réactivité quasi-instantanée lors de l’ouverture de dépôts volumineux comme Orleans ou Aspire. Plusieurs intervenants ont souligné que dans les workflows s’appuyant sur des agents IA de codage, de multiples branches de travail Git (worktrees) et conteneurs légers tournent fréquemment en parallèle. L’ancienne architecture à 6 processus entraînait des gels prolongés et monopolisait 2 Go de mémoire à chaque bascule de branche, alors que le binaire unique Native AOT et le cache sur disque rendent les lancements multiples instantanés.
  • Opposants à la suppression de la vue des dossiers de solutions : Les développeurs habitués à structurer leurs projets au moyen des dossiers de solution virtuels (Solution Folders) ont protesté contre la disparition du volet latéral dédié. L’explorateur de fichiers par défaut de VS Code ne reflétant pas l’arborescence virtuelle des fichiers .sln, l’action « Ajouter une classe » (Add New Class) place fréquemment les nouveaux fichiers à la racine physique du projet au lieu de leur espace de noms logique, rompant avec les conventions d’équipe établies.

Lien source : r/dotnet: A faster, lighter C# Dev Kit


2. Chargement dynamique de plugins managés dans des hôtes Native AOT : le framework Plum et l’architecture hybride en débat

Dans le fil des projets personnels d’octobre sur r/csharp, la communauté a débattu des orientations d’ingénierie autour du framework Plum, dédié à l’intégration de modules d’extension.

Fonctionnement technique et visions opposées :

  • Mécanisme technique : Plum cible les applications hôtes à haute performance compilées en Native AOT. Il utilise le point d’entrée natif HostFXR du runtime .NET pour amorcer dynamiquement CoreCLR à l’intérieur du processus principal. Un chargeur d’assemblys managé personnalisé analyse et charge ensuite le code des extensions dépendant de la réflexion, reliant directement leurs interfaces à l’hôte AOT.
  • Divergences architecturales :
    • Le camp du pragmatisme hybride : Fait valoir que pour les applications de bureau et les consoles industrielles exigeant un démarrage instantané et une extensibilité forte, les écosystèmes tiers ne peuvent pas abandonner la réflexion dynamique et Reflection.Emit du jour au lendemain. Démarrer CoreCLR à la demande via HostFXR préserve la rapidité au lancement tout en autorisant le rechargement à chaud des modules.
    • Le camp de l’ingénierie statique pure : Souligne que la coexistence simultanée du modèle mémoire natif et du ramasse-miettes (GC) du CLR au sein du même processus complexifie considérablement l’analyse des plantages et crée des risques de pointeurs pendants entre runtimes. Le C# moderne devrait privilégier une compilation entièrement statique en reliant les plugins à la compilation via des Source Generators, éliminant définitivement la dette technique d’un double runtime.

Lien source : r/csharp: Come discuss your side projects! (October 2026)


À suivre la semaine prochaine

  • Mardi 13 octobre - Fenêtre de correctifs mensuelle : Le cycle Patch Tuesday de Microsoft apportera les mises à jour de maintenance pour .NET 10.0.13 et .NET 8.0, incluant des correctifs de sécurité et des améliorations de stabilité du runtime. Les équipes gérant des images de base de conteneurs doivent planifier leurs reconstructions.
  • Compte à rebours pour .NET 11 RC 2 : La version candidate finale RC 2 pour .NET 11 entame son compte à rebours de publication. Dernier jalon avant la disponibilité générale lors de la conférence .NET Conf 2026 en novembre, les APIs publiques sont totalement gelées et les mainteneurs de bibliothèques fondamentales doivent procéder à leurs tests de non-régression définitifs.