Connexion
Abonnez-vous

.NET 5.0 en Release Candidate : les erreurs et le futur d’un framework unifié

Gros détours

.NET 5.0 en Release Candidate : les erreurs et le futur d'un framework unifié

Le 24 septembre 2020 à 14h35

L'écosystème .Net est en pleine mutation. À l’occasion de la publication de la première Release Candidate de sa version 5.0, l'éditeur est revenu sur les problèmes rencontrés, évoquant l'avenir de son framework, répondant à de nombreuses question. Notamment tout ce qui touche à .Net Standard.

La technologie .NET a parcouru bien du chemin depuis son introduction en février 2002. Elle se voulait une approche unifiée du développement pour les plateformes Microsoft et le web, faisant la part belle à C#. Depuis, le périmètre a très largement évolué, au point que la société a voulu se recentrer avec .NET Core.

L'accent prononcé sur le multiplateforme ces dernières années a mis en lumière de nombreux problèmes dans la manière dont la construction avait été envisagée. C’est particulièrement vrai pour .NET Standard, qui désigne le lot d’API dont l’implémentation a été validée pour l’ensemble des systèmes supportés.

Aujourd’hui, le modèle prévu est « condamné » : il sera bientôt remplacé par .NET 5.0, tout aussi multiplateforme, sorte d’aboutissement de ce qu’avait en tête Microsoft au départ. Mais il aura fallu des années pour que l’éditeur tâte le terrain, puis change brusquement d’orientation sous l’impulsion des objectifs fixés par Satya Nadella.

Qu’est-ce que .NET Standard ?

Avant de plonger sur les raisons qui ont poussé Microsoft à revoir profondément ses plans, commençons par un rappel des différentes déclinaisons de .NET à l'heure actuelle, en commençant par .NET Standard.

Il s’agit d’une spécification, conçue pour accompagner .NET Core, jouant le rôle de plus petit dénominateur commun pour les projets multiplateformes. Même si .NET Core est lui-même un cadriciel (framework) multiplateforme, les développeurs ont la possibilité de lui adjoindre nombre de paquets pour en augmenter la portée.

.NET Core Framework Standard

.NET Standard était un vrai progrès, puisque les développeurs pouvaient s’y référer pour s’assurer que leurs projets fonctionneraient autant sur Windows que Linux ou macOS, en établissant un socle isofonctionnel. Quand la version 2.0 est sortie en septembre 2017 par exemple, elle était compatible avec .NET Framework 4.6.1, .NET Core 2.0, Mono 5.4, Xamarin iOS 10.14, Xamarin.Mac 3.8 et Xamarin.Android 7.5.

Cette version 2.0 ajoutait la bagatelle de 32 000 API dans le pot commun, d’où son importance. À ce moment-là cependant, le travail était encore « facile », car il s’agissait alors d’implémenter des API existantes. Les problèmes se sont manifestés avec la mouture 2.1, qui s’aventurait sur de nouvelles API.

Les problèmes de .NET Standard

L’une des principales barrières à l’évolution de Standard était l’absence de convergence des plateformes .NET au niveau de l’implémentation. Standard représentait la spécification, mais l’implémentation elle-même pouvait être différente. Conséquence, ajouter une nouvelle API engendrait un intense travail de coordination entre les équipes.

C’est d’autant plus devenu un problème que .NET Core est un projet open source, avec une communauté active ayant largement contribué à développer la BCL (Base Class Library). Devant ce foisonnement, un conseil était chargé de vérifier les nouveautés et de les intégrer si elles étaient implémentées dans au moins une plateforme.

Ce travail a réclamé du temps, trop pour que .NET Standard puisse évoluer à un rythme soutenu. Selon Microsoft, toute API manquant le coche d’une version aurait attendu au moins deux ans pour la suite. En outre, les développeurs auraient dû attendre que l’implémentation suive et se retrouve sur assez de plateformes pour se servir des nouvelles capacités.

L’éditeur se moque volontiers de lui-même et de ces idées qui pouvaient sembler initialement simples. Il passait son temps à créer finalement des piles sous-jacentes pour unifier l’ensemble des API. Le but fut atteint avec .NET Standard, mais qui n’était qu’une spécification, ne corrigeant finalement qu’une partie du problème.

Autre idée qui se voulait au départ pragmatique et a donné de mauvais résultats : l’inclusion d’API spécifiques à des plateformes. Microsoft ne voulait pas faire exploser l’écosystème des bibliothèques et a imaginé cette solution pour permettre une transition douce. Mais il est devenu complexe de prévoir le comportement des API ajoutées par la suite, dans des cas comme Blazor WebAssembly, où une partie des interfaces multiplateformes ne pouvaient pas fonctionner dans la sandbox du navigateur.

Les développeurs ont a priori été nombreux à faire des retours négatifs sur ce point, évoquant des « champs de mine ». Le code était en effet compilé correctement et donnait ainsi l’impression qu’il pouvait fonctionner sur les autres plateformes… pour finalement générer des erreurs.

.NET 5.0 et les futures évolutions annuelles

.NET 5.0 est donc un aboutissement, ou du moins la première étape de l’aboutissement. D’une part, il n’y aura plus d’un côté le framework classique (actuellement en version 4.8.1) et .NET Core, mais un seul environnement. D’autre part – et c’est sans doute le plus important – les spécifications et leur implémentation seront réunies au même endroit. En clair, NET 5.0 est une base de code unique pour tous les développements.

.NET 5.0

Il n’y aura donc plus aucune nouvelle version de .NET Standard. .NET 5.0 est d’ailleurs compatible avec toutes les versions passées de la spécification. Un développeur peut donc sans problème installer le nouveau cadriciel et continuer à viser la version 2.1 de Standard par exemple. Vu par Microsoft, .NET 5.0 et les versions ultérieures continueront le travail de Standard, mais avec une base de code unique et un rythme plus soutenu.

Maintenant que la Release Candidate est là, on attend donc la version finale, prévue pour novembre. Le rythme est d’ailleurs prévu : une nouvelle mouture majeure de .NET tous les ans, une version sur deux étant LTS (Long Term Support). .NET 6.0 sortira ainsi en novembre 2021 et sera une mouture LTS. 

Des versions spécifiques supplémentaires en 2021

Notez que des versions spécifiques sortiront ensuite. Les développeurs pourront ainsi choisir entre une application multiplateforme et un projet visant un système, avec à la clé des API dédiées et donc plus de capacités.

Au départ, ce choix sera limité : .NET 5.0 ne proposera en plus du socle commun qu’une version Windows. Elle contiendra notamment tout ce qui touche à WinForms et WPF, soit à la conception des interfaces sur le système maison et qui n'a rien à faire dans la base commune. À compter de .NET 6.0 en revanche, des versions Android et iOS seront proposées. Une version macOS a de bonnes chances d’être prête également.

net5.0 .net

Qu’en est-il de Linux ? La situation est plus complexe. En clair, Linux en tant que plateforme « n’est pas bien défini ». Le noyau l’est, mais les développeurs n’en seront pas plus avancés dans le cadre d’un framework touchant aux éléments d’interface notamment. La situation est sous surveillance et pourrait changer. En attendant, .NET 5.0 et les versions ultérieures seront bien disponibles sous Linux, mais sans spécificités.

La nomenclature évolue également pour plus de clarté. Tous les TFN (Target Framework Names) auront désormais la forme netX.Y, à laquelle viendra éventuellement s’ajouter un tiret puis le nom de la plateforme. Par exemple, la version initiale de .NET 5.0 s’appellera net5.0, et celle pour Windows net5.0-windows. Quand les moutures Android et iOS sortiront l’année prochaine, on pourra les viser respectivement via net6.0-android et net6.0-ios. La future version pour macOS devrait être logiquement nommée net6.0-macos.

Que doivent faire les développeurs de leurs applications face à .NET 5.0 ? La situation peut être résumée ainsi :

  • Utiliser netstandard2.0 en cas de code partagé entre .NET Framework (l’ancien ) et les autres plateformes
  • Utiliser netstandard2.1 en cas de code partagé .NET Core 3.x, Mono et Xamarin
  • Utiliser net5.0 dans les autres cas

D’ailleurs, ce n’est pas parce que .NET 5.0 arrivera que les développeurs auront à prendre rapidement une décision. La question ne se pose que pour le retargeting, par exemple s’ils souhaitent tirer parti des apports de .NET 5.0.

Dans un prochain article, nous nous pencherons sur les évolutions de C# et les nouvelles orientations que Microsoft donne à son langage fétiche. 

Commentaires (27)

Vous devez être abonné pour pouvoir commenter.

Abonnez-vous
votre avatar

Je n’y connais pas beaucoup en C# mais .NET Core semblait être le renouveau de .NET Framework. Une version multiplateforme, plus rapide, plus puissant, plus propre, etc… J’avais l’impression qu’on se rapprochait d’une version stable.
Et là… On change à nouveau de feuille de route ? Quid de la maturité du langage ?
.NET 5.0 a l’air à nouveau prometteur mais ça serait bien de se stabiliser un peu pour séduire les entreprises (et moi) sur le long terme.

votre avatar

Ce n’est pas forcément évident mais .NET 5 est la version suivante après .NET Core 3.1 qui est maintenant plutôt mature.
La vrai nouveauté c’était la sortie de .NET Core. Les versions suivantes ont apportés des améliorations et préparé la convergence pour arriver à une seule version pour toutes les plateformes : un travail de titan vu l’ampleur de la tâche.

votre avatar

Bon article sur .NET 5, merci Vincent!




Je n’y connais pas beaucoup en C# mais .NET Core semblait être le renouveau de .NET Framework. Une version multiplateforme, plus rapide, plus puissant, plus propre, etc… J’avais l’impression qu’on se rapprochait d’une version stable. Et là… On change à nouveau de feuille de route ? Quid de la maturité du langage ? .NET 5.0 a l’air à nouveau prometteur mais ça serait bien de se stabiliser un peu pour séduire les entreprises (et moi) sur le long terme.


Les versions .NET Core 2.1 à 3.1 sont stables et utilisées en production.
Rien ne change vraiment, .NET 5 est plus la réunification tant attendue entre .NET Framework et .NET Core. On revient simplement à un seul .NET qui est maintenant OSS et xplat, distribué en dehors du canal du Windows update.
Pour le language, .NET est une plateforme où plusieurs langages coexistent (C#, F#…). Et pour ne prendre que C#, le langage est mature, arrive à sa version 9.0 avec .NET 5 (avec une évolution du langage pratiquement tous les ans maintenant)

votre avatar

Dites moi concernant Burst est-ce réservé uniquement pour Unity ?

votre avatar

La toute première version était hard, il fallait prendre de nouvelles habitudes sur un certain nombre de choses et surtout elle était minimaliste mais ça rox fort depuis lea 2 c’est stable et puissant.



Un très gros boulot a été effectué sur l’outillage embarqué et sur l’executable dotnet en lui même.



Avec la version 5 on voit déjà arrivé pas mal de libs tirant parti des code generators, surtout dans le DI pour le moment il est vrai que ça permet de complètement viré la reflection pour ce genre de chose et ce n’est pas plus mal surtout si on veut continuer d’avance plus loin dans l’AOT. Il y a aussi quelques milliers d’attributs à poser pour ça dans la BCL pour ça si ça vous intéresse :mad2: :mad2: :mad2: un truc à rendre chèvre mais bon faut qu’on le fasse.

votre avatar

Article tres sympa, attention à certains endroits il y a confusion entre “.Net standard” et “.Net Core”

votre avatar

J’étais tenté pour un travail multiplateforme en interne.
Hélas, .Net Core ne permettait pas d’utiliser des WinForms sous Linux …



J’espère que ce sera corrigé dans les versions suivantes de .Net

votre avatar

Faut utiliser Mono si tu veux avoir une implémentation des Winforms sous Linux.



Après pour avoir mangé pas mal de C# et de Java le premier est plus adapté à des clients lourds alors que le deuxième est bien mieux pour tout ce qui est côté serveur. Le problème n’est pas tant au niveau du langage (quoique les collections de C# sont pour l’instant vraiment à la ramasse comparées à Java) mais bien au niveau de l’écosystème. À ce niveau passer de Java à .Net c’est comme faire un saut de 15 ans en arrière et je suis gentil…

votre avatar

Je ne connais pas du tout Java mais je trouve celles de C# super bien, du coup qu’est-ce qu’elles ont de si bien celles de Java ?

votre avatar

Même question.



Je me demande si il n’a pas inversé. Mais je ne connais pas assez java, c’est peut être moi qui me trompe.

votre avatar

Ton affirmation me surprend. Peux-tu développer STP ?

votre avatar

Le but du multiplateforme, c’est plutôt de faire du service/CLI avec la simplicité d’un .Net et son écosystème, là où certains font du Go/Rust/Python/whatever (sans interface graphique spécifique). WinForms est intrinsèquement lié à Windows, ce qui est à la fois une de ses forces (je fais facilement une app avec un look “connue”) mais aussi sa faiblesse du fait que ce ne soit pas portable. Je doute que ce soit adapté un jour à Linux ou d’autres systèmes.



Mais à mon sens une fois que tout le travail de réunification sera fait, il faudra forcément qu’ils se penche sur la question des GUI, que ce soit pour interfacer avec de l’existant ou proposer leur alternative et ne pas nécessiter que ça passe uniquement par de l’interface web par exemple.

votre avatar

Arcy a dit:


J’étais tenté pour un travail multiplateforme en interne. Hélas, .Net Core ne permettait pas d’utiliser des WinForms sous Linux …


Winforms est une hérésie, dès .Net 1.1 c’était décrié: c’était trop lié à Windows (GDI), donc non portable et d’un autre temps. Ensuite ils ont sorti WPF et on s’est retrouvé avec deux plate-formes. Après Windows 8 et 10 sont sortis et ça a encore changé.



Actuellement, je fais du .Net core avec serveur web intégré, et je lance le navigateur de la plteforme sur localhost…

votre avatar

Merci pour cet article, toujours bien documenté comme d’habitude.
J’ai apprécié l’emploi du terme cadriciel en lieu et place de Framework.

votre avatar

David_L a dit:


Mais à mon sens une fois que tout le travail de réunification sera fait, il faudra forcément qu’ils se penche sur la question des GUI, que ce soit pour interfacer avec de l’existant ou proposer leur alternative et ne pas nécessiter que ça passe uniquement par de l’interface web par exemple.


C’est prévu, avec MAUI, qui devrait être disponible avec .NET 6. Il faut le voir comme une évolution de Xamarin.Forms mais visant également le Desktop. Et de manière officielle et non pas communautaire comme c’est le cas actuellement. Cela voudra dire une très bonne stabilité multiplateforme, et non pas des supports plateforme partiels avec certaines qui sont en développement, en alpha ou beta comme actuellement…

votre avatar

(reply:1826096:tiret) (reply:1826104:xxxo) (reply:1826108:Vekin) (reply:1826111:ndjpoye)


Soit il a inversé, soit il y a pas touché à c# depuis bien longtemps. Aujourd’hui un petit dotnet new webapi et tu as un api fonctionnelle.

votre avatar

Non non pas d’inversion. Par exemple le @Transactional pour les transactions en base de données n’a pas d’équivalent en dotnet qui permet de faire des transactions en base sans polluer ton code. De manière générale Java est bien mieux outillé pour tout ce qui est AOP que dotnet. Les attributs C# sont plus simples à utiliser que les annotations Java mais ces dernières offrent bien plus de degrés de liberté.



Dans la même veine logback est bien en avance par rapport à Serilog, notamment si on veut envoyer des messages sur Logstash avec logstash-logback-encoder. Les collections de dotnet sont aussi à la ramasse par rapport à celles de Java (l’interface List de Java référence toutes les méthodes des implémentations, alors qu’en dotnet IList ne retourne qu’une partie des méthodes vu que List implémente en fait trois ou quatre interfaces, chacune avec ses propres méthodes).



Enfin en terme d’outils de build C# est au niveau de ant+Ivy en plutôt moins bien, Java en est à Maven ou Gradle. Le premier a plein de défauts dont sa verbosité et le fait que si on n’y prête pas attention les builds ne sont pas reproductibles, mais il permet de lancer en une seule commande la compilation, les tests, la couverture de code et j’en passe. Ce n’est pas encore possible en C# de manière simple, notamment pour la couverture de code par les tests (non Coverlet n’est toujours pas au point si on veut avoir une couverture agrégée de tous les projets d’une solution, alors que JaCoCo marche très bien).



Après oui Java en tant que langage est très en retard par rapport à C# (la spec JavaBean, beurk !) même si ça s’améliore avec les versions récentes, mais en terme d’écosystème c’est bien l’inverse désolé. Et je fais du C# en ce moment, merci. :-)

votre avatar

Toi t’as rien suivi depuis au moins 10 ans

votre avatar

@Transactional est une vraie purge, faut voir un peu la crasse généré derrière. Pour infos les annotations c’est du J# pas du java fallait suivre en 2001 pour ça. De plus l’AOP est une vraie plaie, il n’y a aucun moyen de controller le code généré qui est très souvent merdique à souhait.



A l’heure actuelle il n’y a rien que logback sache faire que Serilog ne sache pas faire… Et ce sont des libs tierce donc faut en parler à leurs auteurs respectif.



Il ne faut vraiment rien avoir capté à la conception des collections en dotnet pour balancer des inepties pareil. Les ensembles de données ont toutes au moins une interface commune IEnumerable, et IEnumerable. Ensuite il y une spécialisation avec ICollection par exemple, puis IList qui est un type particulier de collection, étant lui même un ensemble de données donc IEnumerable. On appel ça s’occuper de ces oignons et pas de ceux des autres.



mais il permet de lancer en une seule commande la compilation, les tests, la couverture de code et j’en passe . J’ai du mal à voir comment ça n’est pas possible nous faisons ça tout les jours sur nos différents projets dotnet ^^ .

votre avatar

Les annotations en Java officiel datent de Java 5, ce qui remonte à 2004. Après pour le reste je ne vais pas épiloguer, si ça existait en J# avant c’est possible, je ne sais pas. En Java le xdocklet servait plus ou moins à ça en moins bien et c’est pour ça qu’ils ont mis en place les annotations, car effectivement xdocklet relevait de la bidouille immonde.



Mais bon en Java si tu fais : Set.equals(Set) il comparera tous les éléments du Set. En dotnet il fera uniquement une comparaison par référence. Ça peut être une purge pour écrire des equals/hashCode corrects.



Pour le transactionnel je m’abstiendrai de répondre.

votre avatar

si ça existait en J# avant c’est possible => ça vient de J# tout comme plein d’autres trucs en Java que Microsoft a transféré des versions expérimentale de C# pour les ajouter dans sa version custom de la JVM à l’époque. Histoire que ce machin soit utilisable pour autre chose que des hello world, et ça a marché lol

votre avatar

Si je comprend bien avec .net 5.0 on pourra toujours faire un projet WPF comme un projet UWP. C’est bien de regrouper/réorganiser les choses mais on est pas encore dans une logique d’universalité de bout en bout.

votre avatar

Vivement la prochaine unification de l’unification de l’unification. C’est un bordel sans nom ces transitions d’une version de .NET à l’autre, ainsi que les nomenclatures choisies qui portent à confusion.

votre avatar

En fait c’est assez simple



.Net Framework implémentation possible de la technologie CLR/CLI de Microsoft
Mono implémentation possible de la technologie CLR/CLI de Miguel Icaza



.Net Framework est figé
.Net Core, implémentation de la technologie en mode multiplateforme par Microsoft (Censé perdre la suffix Core une fois dépassé la version 3)



.NET5, implémentation unifié regroupant CoreClr, Mono, Xamarin. Il est dès lors possible de switcher de CLR en fonction des spécificités de son besoin par exemple.



SI vous voulez suivre ou participer au dev c’est pas ici : github.com GitHub

votre avatar

Très bon article merci! moi qui ne suit pas .Net depuis très longtemps je suis content de voir comment ça évolue.



Je fais du Java tous les jours pour le boulot alors que je suis issue d’une formation très axée Microsoft C#.



Java a ses avantages et ses inconvénients et il y aura toujours le débat pour définir quel est le meilleur entre lui et C#.



J’utilise les annotations, les EJB , JPA, Spring etc… tous les jours et ça me permet de produire du code rapidement et le code fait exactement ce que je souhaite.



Pour le débat des collections si quelqu’un peut m’expliquer les avantages et les inconvénients de C# par rapport à Java de ce côté je suis preneur :)

votre avatar

Déjà quand je vois comment son compilé les lambdas expression sur tout ce qui tourne sur la JVM j’ai des cauchemars. Rien que la gestion des types :fou: :fou: et surtout des génériques ^^ franchement c’est inadmissible.



Ils en sont à int (struct), Integer (class) parce qu’incapable d’implémenter correctement les nullables en 2000, finalement au bout de 15 piges ils sont pu gérer ça pas proprement mais on va dire de façon satisfaisante maintenant on peut faire des Optional . Quelle farce.



La JNI :mdr2: :mdr2: :mdr2: :mdr2: :mdr2: :mdr2: sans déconné qu’est-ce c’est qu’cette me* franchement ^^ On peut faire de la double initialisation d’objet on nage ne plein délire.



Toto x = new Toto()
Toto y = new x();



ça passe comme une lettre à la poste :keskidit: :keskidit: :keskidit: WTF ? Ok, l’interopérabilité est quelques choses qui n’a jamais été pensé dans la conception d’origine de la JVM puisque ce truc était uniquement censé tourner sur des smart tv et la Warner s’en foutait, mais quand même un peu de sérieux.



Pour les collections je répondais simplement au fait qu’en dotnet les collections ont une interface commune. Que chaque interface est une spécialisation de cette dernière et n’ont pas un gloubi-boulga de trucs qui n’ont rien à faire ensemble puisque définissant des types de jeux de données différents et des intentions différentes. Donc le développeur doit réfléchir à ce qu’il veut renvoyer et pourquoi, si c’est une List, est-ce que renvoi la List, ou alors IList, ou alors ICollection etc.

votre avatar

tiret a dit:


qu’en dotnet IList ne retourne qu’une partie des méthodes vu que List implémente en fait trois ou quatre interfaces, chacune avec ses propres méthodes).


En fait IList hérite d’Icollection qui hérite d’IEnumerable. C’est juste plis compartimenté qu’en Java. C’est très utile quand par exemple dans une méthode tu veut juste énuméré les éléments, tu réclamés un Ienumerzble. Que derrière ce soit une Liste, un tqbleau etc.. n’a pas d’importance. Et niveau quantité de collection différente (Hashset, Dictionnary, etc…) dotNet est bien fourni.

.NET 5.0 en Release Candidate : les erreurs et le futur d’un framework unifié

  • Qu’est-ce que .NET Standard ?

  • Les problèmes de .NET Standard

  • .NET 5.0 et les futures évolutions annuelles

  • Des versions spécifiques supplémentaires en 2021

Fermer