Comme vous le savez peut-être déjà, je suis actuellement architecte logiciel chez C2S Bouygues depuis bientôt 10 ans. Ma boite est très orientée Microsoft, et j’ai donc, sur ces 10 années, pu observer et expérimenter l’évolution du framework .NET.

Pourquoi j’écris cet article ?

En 1er lieu, parce que j’apprécie cette stack technique, que j’utilise quotidiennement, et que je souhaite partager cette passion. Ensuite, parce que je rencontre beaucoup de personnes qui sont restés bloqué au “vieux” .NET (on reviendra sur cette notion de “vieux” un peu plus tard). Et enfin parce que j’en ai marre d’entendre ce genre de phrase :

  • .NET c’est propriétaire
  • .NET ça ne fonctionne que sur Windows
  • .NET c’est lent / pas performant
  • Microsoft c’est le mal

Sur le web, on retrouve énormément d’article parlant de “pourquoi Rust c’est la vie”, “pourquoi j’ai switché de Go vers Rust” ou encore “Deno, comment il va tous les tuer”

Et .NET dans tous ça ? :)

On va le voir ensuite, mais pour moi, le principal problème est que le .NET “moderne” (anciennement .NET Core) est terni dans l’industrie par son héritage .NET Framework. Beaucoup de personnes pensent encore que .NET est un framework lent, monolithique et réservé à Windows…

C’est aujourd’hui (et depuis plusieurs années ;) ), absolument faux ! Et c’est ce que nous allons essayer de debunker dans cet article.

Let’s start with a history

Pour bien comprendre l’évolution du .NET Framework, il me semble important de retracer le chemin parcouru depuis les premières versions.

L’ère .NET Framework

Le framework .NET est né vers la fin des années 90 et la première version officielle le 13 février 2002 (v1.0). Les versions se sont ensuite enchainées au fil des années, jusqu’à la plus récente en avril 2019 (v4.8). Celle-ci sera probablement la dernière version majeure pour cette génération du framework (hors patchs et correctifs de sécurité).

Journey of .NET Framework - https://www.clariontech.com/blog/the-.net-revolution-an-overview-of-the-.net-framework-versions Journey of .NET Framework - https://www.clariontech.com/blog/the-.net-revolution-an-overview-of-the-.net-framework-versions

Au fil du temps, le framework .NET a évolué et s’est enrichi. Je ne peux pas toutes les citer, mais je vais présenter les fonctionnalités ou technologies qui me semblent les plus marquantes :

  • ASP.NET Web Forms, permettant de développer des applications web (avec le fameux ViewState).
  • WPF, pour Windows Presentation Foundation, permettant de développer des applications desktop Windows à l’aide de la syntaxe XAML pour la description des interfaces.
  • Silverlight, alternative à Adobe Flash (et donc basé sur un système de plugin pour browser), permettait de développer des applications web riches. L’UI pouvait être écrite avec du XAML. La durée de vie de Silverlight n’a pas été très longue…
  • WCF, pour Windows Communication Foundation, permettant de faire des services web (SOAP).
  • WinForms est en quelque sorte l’ancêtre de WPF. Il permettait de développer des applications desktop basées sur la programmation événementielle.
  • ADO.NET est la couche d’accès aux données (aka. base de données relationnelles). Elle fait partie de la BCL (Base Class Library). On retrouve plusieurs providers : SQL Server, OLE DB (Object Linking and Embedding), Oracle, ODBC (Open DataBase Connectivity)
  • LINQ, pour Language Integrated Query, est un langage de requête permettant d’interroger les données en C# avec une syntaxe proche du SQL (filtrer, projeter…).
  • .NET Compact Framework est une version du framework spécialement conçue pour les périphériques mobiles (Windows CE et Windows Mobile). Il s’agit d’un sous-ensemble du framework, dont la taille et les performances ont été optimisées pour une exécution sur des devices limités.
  • AJAX.NET est un ensemble d’extensions pour ASP.NET permettant d’éviter un rechargement complet de la page (le fameux postback).

Jusqu’à maintenant, le .NET Framework est disponible uniquement sur Windows (hors Mono).

L’ère .NET Core

A partir de 2014, Microsoft décide de changer de direction et dévoile .NET Core. Cette date correspond aussi à l’arrivée de Satya Nadella en tant que CEO.

Ce changement est très important et présente de nombreuses nouveautés, assez surprenante de la part Microsoft, notamment le cross-plateforme et l’open-source (un GitHub public existe !).

La première release est disponible en juin 2016 et .NET Core est désormais considéré comme la cible principale pour les nouveaux projets. Microsoft migre les services existants vers Core et en profite pour faire du tri. Des services disparaissent, comme WCF par exemple.

On peut aussi désormais installer plusieurs versions différentes de .NET Core sur le même OS ou encore intégrer directement le framework dans l’application. L’un des bénéfices de cette approche est de permettre à Microsoft de faire évoluer beaucoup plus rapidement .NET Core par rapport à .NET Framework.

2016 est aussi l’occasion pour Microsoft d’acquérir Xamarin. C’est une société développant une implémentation open source de .NET, Mono, dans le but de pouvoir l’exécuter sous les environnements Unix.

.NET Core a vu passer 3 versions majeures, et chacune a apporté son lot de nouveautés :

  • [06/2016] .NET Core 1 : Focus sur les performances web et les micro-services, utilisation via la ligne de commande
    • [11/2016] .NET Core 1.1
  • [08/2017] .NET Core 2.0 : Ajout de plus de 20K APIs et composants (Razor Pages, SignalR…) pour simplifier la migration des applications web vers .NET Core
    • [05/2018] .NET Core 2.1
    • [12/2018] .NET Core 2.2
  • [11/2019] .NET Core 3 : Intégration du support des applications desktop, avec WinForms, WPF et EF6, pour simplifier la migration des apps desktop vers .NET Core. C’est aussi l’occasion d’ajouter le support pour les scénarios IoT et ML.NET.
    • [12/2019] .NET Core 3.1

A partir de .NET Core 3, Microsoft va arrêter de migrer des fonctionnalités à partir du .NET Framework. Les futurs investissements seront entièrement consacrés à .NET Core. Pour Microsoft, c’est désormais la cible officielle pour construire tout nouveau projet .NET.

L’ère .NET moderne (aka. .NET Core vNext)

En mai 2019, nouveau big bang chez Microsoft : l’annonce de la release 5 qui va avoir la lourde tâche de fusionner .NET Framework et .NET Core ! Fusionner, et même unifier, pour avoir enfin une plateforme permettant de construire des projets cloud, web, IoT, mobile et desktop avec les mêmes framework, SDK et runtimes. La version 5 sortira finalement en novembre 2020 (merci le COVID :D).

.NET 5 Unified platform - https://devblogs.microsoft.com/dotnet/introducing-net-5/ .NET 5 Unified platform - https://devblogs.microsoft.com/dotnet/introducing-net-5/
.NET 6 Unified platform - https://devblogs.microsoft.com/dotnet/announcing-net-6/ .NET 6 Unified platform - https://devblogs.microsoft.com/dotnet/announcing-net-6/

Mais du coup, où est passé .NET Core 4 ? En réalité, Microsoft a profité de cette fusion pour sauter ce numéro de version. Premièrement pour éviter toute confusion avec le .NET Framework 4.x. Et deuxièmement pour bien matérialiser le renouveau et le changement de direction de la plateforme. Ils en ont aussi profité pour simplifier le nommage, en retirant le “Core” (sauf pour ASP.NET et Entity Framework qui eux le conserve).

.NET 5 est donc le véritable commencement du .NET moderne. Et depuis, Microsoft a adopté un nouveau cycle de publication : une release majeure par an (en novembre), et celles avec un nombre pair sont en LTS (Long Term Support, soit 3 ans).

Modern .NET release roadmap Modern .NET release roadmap

Le nouveau .NET s’articule autour de 4 pilliers :

  • productivité
  • performance
  • securité
  • fiabilité

Concernant la sécurité et la fiabilité, globalement, le framework .NET a toujours eu bonne réputation à ce sujet. Par contre, pour la productivité et la performance, c’est plutôt des nouveaux sujets !

Microsoft fait énormément d’effort, à chaque release, sur les aspects performances. Et cela paye !

.NET 5 performance .NET 5 performance

Côté productivité, on note évidemment le côté multiplateforme (aussi bien pour l’exécution que pour le développement), via la ligne de commande/CLI ou bien des IDE comme Visual Studio/Visual Studio Code.

.NET 6, puis .NET 7, ont par la suite apportés leurs lots d’évolutions significatives :

  • Le support rapide de nombreux standards, comme gRPC, OpenTelemetry ou encore HTTP/3
  • Le support des dernières versions de C# (on reparle juste après)
  • Le rechargement à chaud (on modifie le code source de son application, on enregistre et les modifications sont instantanément prise en compte sans avoir besoin de rédémarrer)
  • L’arrivée de .NET MAUI, successeur de Xamarin, pour développer des applications clientes natives multiplateforme (Android, iOS, Windows, MacOS)
  • L’enrichissement de l’écosystème, et en particulier les packages NuGet
  • La prise en charge native de la publication sous forme de conteneur
  • Les minimales APIs, une approche formidable pour créer des APIs avec ASP.NET Core. Je ne rentre pas dans le détail ici, mais promis, je prépare un article dédié sur ce sujet… :)

C# (aka. C sharp)

On ne peut pas parler de .NET sans parler de l’un de ces langages phares : C# ! (même s’il ne faut pas oublier F# et VB ;) ).

Attention, les outils du compilateur C# sont maintenant dissociés du cycle de mise en production des bibliothèques .NET.

En général, tout cela est transparent. Mais dans le cas où vous utilisez une version du langage plus récente (faisant donc appel à des fonctionnalités non encore disponibles dans .NET), il sera nécessaire de référencer des packages NuGet.

Malgré son ancienneté (la première version est sortie en septembre 2002), C# est un langage moderne, orienté objet et fortement typé, convenant aussi bien pour des fonctionnalités haut-niveau (les records par exemple) que bas-niveau (les pointeurs de fonction par exemple).

C# a été le 1er langage mainstream à introduire la syntaxe async/await permettant de simplifier la programmation asynchrone.

C’est un langage qui évolue, en suivant diverses influences, aussi bien l’état de l’art en terme de programmation que les demandes de la communauté (par exemple, les approches fonctionnelles de pattern matching). Il jouit d’ailleurs d’une bonne popularité auprès de la population des développeurs.

  • C# 8.0 est la 1ère version qui cible spécifiquement .NET Core (09/2019). On peut noter les membres read only, les fonctions statiques locales ou les types références nullable.
  • C# 9 a été publié avec .NET 5. On peut noter les records, les top-level statements ou les init-only properties.
  • C# 10 est arrivé avec .NET 6 et est accompagné des global using directives, les file scoped namespaces ou les améliorations sur les lambdas.
  • C# 11 apporte le mot clé file (pour limiter la visibilité d’un type au fichier), les attributs génériques ou le modificateur required.

Concernant C# 12, il est dors et déjà en cours de développement. Vous pouvez d’ailleurs suivre l’avancement sur le dépôt GitHub de Roslyn.

Deep dive !

Prenons quelques minutes pour faire le tour de 3 composants importants du framework .NET :

  • .NET Core Libraries
  • .NET Core Common Language Runtime
  • .NET Core Runtime

.NET Core Libraries (aka. CoreFX ou BCL)

Il s’agit de l’ensemble des classes de base des namespaces System.* et de quelques Microsoft.*. On les connait aussi sous le nom de BCL (Base Class Library). C’est le socle sur lequel s’appuie les autres composants.

Il s’agit des classes et des types permettant de réaliser des opérations de base, comme la manipulation des chaines de caractères, la connexion à une base de données ou encore les opérations avec le système de fichiers. Voici quelques exemples d’espaces de nom de la BCL :

  • System.Collections
  • System.IO
  • System.Reflection
  • System.Text
  • System.Threading

Elles sont entièrement écrites en C#.

.NET Core Common Language Runtime (aka. CoreCLR)

C’est le moteur d’exécution du framework .NET. Pour faire un parallèle, on peut le comparer à la machine virtuelle Java.

Il est disponible en open-source depuis 2015.

Il fournit plusieurs fonctionnalités comme le garbage collector (aka. ramasse-miettes) ou encore le compilateur RyuJIT.

Avec CoreCLR, l’objectif de Microsoft est de fournir un environnement d’exécution multiplateforme. Pour cela, il est écrit avec un mélange de C# et de C++ et le mécanisme de build est basé sur CMake (qui est un moteur de compilation disponible sur Windows, Linux et Mac).

Si vous voulez en savoir plus, Microsoft fournit une excellente documentation à ce sujet.

.NET Core Runtime (aka. CoreRT)

CoreRT est un projet en cours de développement. C’est une sorte d’évolution de CoreCLR, mais optimisé pour l’AOT (Ahead of Time Compilation). CoreRT partage le même garbage collector que CoreCLR ainsi qu’une partie du code source.

En quelques mots, l’AOT permet de générer du code au moment de la construction de l’application plutôt que lors de son exécution (aka. JIT, Just In Time). Cela permet d’obtenir des applications plus légères, sous la forme d’un fichier unique (incluant donc application et dépendances). On y gagne aussi au niveau du temps de démarrage et des performances générales. Par contre, il est nécessaire de produire un binaire par architecture cible (aka. système d’exploitation).

Si vous êtes intéressé par ce sujet, je vous laisse quelques liens pour aller plus loin :

Conclusion

Avec cet article, j’espère vous avoir convaincu (si ce n’était pas déjà le cas :D), que le framework .NET a très largement évolué et changé ces 10 dernières années (et dans le bon sens !). Il est utilisable pour de nombreux cas d’usages, des sites web aux APIs en passant par les applications desktop et mobiles, l’IoT et bien sûr le cloud. Au delà de cette pluralité d’usage, il est désormais multiplateforme : Windows évidemment, mais aussi Linux et MacOS. L’écosystème est riche et complet, notamment concernant l’outillage (Visual Studio, VS Code, NuGet…).

Enfin, l’évolution la plus importante est pour moi l’ouverture à l’open source. Cela permet une meilleure visibilité sur les évolutions (aka. roadmap) ainsi qu’un renforcement de la qualité globale (auditabilité, détection des failles…). C’est aussi excellent pour la popularité du framework, qui ne cesse d’augmenter dans la population des développeurs, ainsi que les ressources associées (documentations, tutoriels, formations…).

Pour terminer, je vous laisse avec quelques liens :