.Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Parce qu'il en faut pour tout le monde, discutez ici d'ADA, de shell et autres Wolfram...

Modérateur : Francois

Bud Spencer
Raspinaute
Messages : 1069
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mer. 5 janv. 2022 16:46

Pour ceux qui suivent un peut l’évolution de C# au travers de .NET, il y avait eu un sujet qui avait pas mal fait débat pendant la construction de .NET5, ce sont les instructions de niveau supérieur. Le but de tout ça était de simplifier l’écriture du code de façon à le rendre plus abordable pour les débutants. Microsoft qui vise plus a enrichir et rendre .Net de plus en plus performant n’était pas très chaud pour ajouter cette possibilité, mais comme la demande de la communauté était vraiment forte sur cette question, cela a été fait.

Prenons l’exemple d’un exercice tout simple ou l’on veut un petit programme qui fasse appelle à une fonction. Si on revient à .NET Core 3 (C# 8) , voilà ce qu’il fallait écrire :

Code : Tout sélectionner

using System;
namespace ConsoleApp1
{
   class Program
    {
        void Main(string[] args)
        {
            Console.WriteLine("Resultat : " + AddOne(5));
        }

        int AddOne( int x)
        {
            return x + 1;
        }
    }
}
Forcément, pour le débutant, c’est un tout de suite plein de questions. namespace c’est quoi ?, pourquoi class ? Main c’est avec combien de doigt ect ect … Résultat, beaucoup se sont imaginé que C# était trop compliqué pour des petits programmes comparés à d’autres langages.

Qu’à cela ne tienne, avec C# 9 (.NET 5) il avait été introduit ce que l’on appelle les ‘Top Level Statements’ (Instructions de Niveau Supérieur). Avec cette nouvelle fonctionnalité, on pouvait désormais s’affranchir de devoir créer un point d’entrée (Main) qui forcément devait se trouver dans une class elle-même contenue dans un espace de nom. Voilà donc comment on pouvait écrire la même chose avec .NET 5

Code : Tout sélectionner

using System;

Console.WriteLine("Resultat : " + AddOne(5));

int AddOne(int x) 
{ 
	return x + 1; 
}

Avec .NET 6 et C# 10, ils en ont encore remis une couche sur la simplification avec une nouvelle directive qui s’appelle ImplicitUsings. Cette directive est par défaut activée dans tous les template de projets vide .NET 6. Elle permet de définir les références (using) de manière globale pour tout le programme. Un fichier NomDuProgramme.GlobalUsing.g.cs est créé automatiquement par le template (dans le sous répertoire obj/*/net6/). Ce fichier contient déjà les using standard pour le type de projet choisi. C’est ce qui explique pourquoi on peut maintenant ne plus avoir besoin d’écrire using system ;

Code : Tout sélectionner

Console.WriteLine("Resultat : " + AddOne(5));

int AddOne(int x) 
{ 
	return x + 1; 
}
A préciser que AddOne est toujours une fonction et de fait elle peut être indifféremment écrite avant ou après l'appel, donc ça marche aussi

Code : Tout sélectionner

int AddOne(int x)
{ 
	return x + 1;
}

Console.WriteLine("Resultat : " + AddOne(5));

Alors bien sûr, ces petites choses n’ont que peu d’intérêt pour ceux qui avaient déjà une certaine maitrise du langage C# mais pour ceux qui débute ça simplifie énormément les choses.
J'écris ca parce que je suis tombé sur un billet ou l’auteur fais la comparaison du Template ASP.NET 6 vide avec l’ancienne version de .NET et avec NodeJs. On constate que Template ASP.NET 6 créé un mini serveur web qui retourne une page ‘’hello word’’ et ca avec avec 4 lignes de code.

https://lee-jdale.medium.com/net-6-mini ... 2f00644230

Intéressant non ?
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1069
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par Bud Spencer » jeu. 6 janv. 2022 10:01

Un autre truc que je viens de découvrir c’est dotnet-script. Apparemment ça existe depuis .Net Core 2.1 et c’est passé en version 1.3.1 avec .NET 6 pour support C# 10.

C’est bien sur multiplateforme, donc ça fonctionne très bien sur le PI. On peut donc écrire des scripts (fichier en .csx avec un shebang #!/usr/bin/env dotnet-script) ou utiliser une console REPL (Read Evaluate Print Loop) pour exécuter des lignes de code à la saisie.

Pour l’utiliser, vous devez bien entendu avoir installé .NET. La console REPL peut être lancé par une commande dotnet script et on peut créer des scripts à partir de la commande dotnet script init <nomduscript>. On peut aussi simplement créer manuellement un fichier monscript.csx puis l’executer avec une commande dotnet script monscript.csx. La méthode en passant par init à l’avantage de créer un fichier omnisharp.json qui peut contenir le ciblage de la version de .NET (utile si on a plusieurs versions d’installées), la liste des package nugets nécessaire (s’il y en a) et permet l’exécution à partir d’une simple commande ./monscript.csx

Il y a pas mal d’autres commandes qui permettent de faire du Piping, du débogage, de la convention de script en exécutable ou en librairie, de l’exécution de script à distance ect …

Ne faisant que rarement des scripts, je ne connaissais pas cette faculté de .NET mais ça semble plutôt pas mal et vraiment très complet avec en prime toutes la puissance et la richesse de .NET 6 et C# 10.

https://www.elliotdenolf.com/posts/csha ... et-script/
https://www.hanselman.com/blog/c-and-ne ... lobal-tool
https://github.com/filipw/dotnet-script
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

smog
Messages : 40
Enregistré le : mar. 24 nov. 2020 08:03

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par smog » mar. 11 janv. 2022 13:55

Très intéressant tous ces retours. Merci !

Bud Spencer
Raspinaute
Messages : 1069
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mar. 18 janv. 2022 19:46

Salut Smog. Ouais, plein de truc très intéressants.
Dès que j’aurais un peu de temps, j’écrirais peut etre un nouveau fil tuto pour expliquer comment utiliser un PI comme plateforme de développement .NET. Contrairement à ce topic ci qui était plutôt destiné à des utilisateurs ayant déjà un niveau potable en poo, j’orienterais le prochain vers une approche plus ‘débutants’.

Pour le reste, .NET continu tranquillement son petit bonhomme de chemin bien au delà du PI :P
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

smog
Messages : 40
Enregistré le : mar. 24 nov. 2020 08:03

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par smog » mer. 26 janv. 2022 15:39

Bud Spencer a écrit :
mar. 18 janv. 2022 19:46
Salut Smog. Ouais, plein de truc très intéressants.
Dès que j’aurais un peu de temps, j’écrirais peut etre un nouveau fil tuto pour expliquer comment utiliser un PI comme plateforme de développement .NET. Contrairement à ce topic ci qui était plutôt destiné à des utilisateurs ayant déjà un niveau potable en poo, j’orienterais le prochain vers une approche plus ‘débutants’.

Pour le reste, .NET continu tranquillement son petit bonhomme de chemin bien au delà du PI :P
Ce serait génial, merci à toi !!

Arduino-RPI
Messages : 24
Enregistré le : mar. 26 mai 2020 15:21

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par Arduino-RPI » ven. 4 mars 2022 08:53

Hello Bud,
Je me permets de venir te solliciter pour un problème que je rencontre sur une application asp mvc5 depuis quelques semaines.
Je rencontre quelques soucis de plantage (1 par jour) d'entity+injection (ninject) + acces conccurent ? sur une application de plus en plus sollicitée.
Lorsque ce plantage arrive, l'application ne répond plus et pour relancer au plus vite je recycle le pool d'application (sur iis).
Dans les logs, j'ai le message "The operation cannot be completed because the DbContext has been disposed".
Au passage aussi, sur certains traitements (génération de doc), c'est hyper lent...les acces à la base semblent d'une lenteur...(entity a optimiser...)

Pour les plantages, je soupçonne une mauvaise implémentation des repositories injectés avec ninject et peut etre mal disposés...
J'essaie d'analyser cette partie en ce moment (ninject avec InRequestScope, puis le dispose des repo...), mais pas simple car en debug je ne le reproduit pas...

Je voulais savoir si tu avais déjà rencontré ce genre de problème "DbContext has been disposed" ?

Je vais aussi faire une montée de version de l'applicatif car elle est toujours en net4.0...

Bud Spencer
Raspinaute
Messages : 1069
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par Bud Spencer » lun. 7 mars 2022 14:53

Salut ArduinoPi.
Le problème peut avoir différentes causes, mais à chaque fois que je suis tombé sur ce genre de message d’erreur avec des vielles appli mvc, c’était dut à des appels de requêtes link différées dans des contrôleurs. Une requête link n’est pas exécutée lors de l’appel, mais plus tard quand le résultat est exposé (généralement dans la vue). Ce cas est fréquent quand par exemple le dbcontext est déclaré dans un bloc using ou dans un thread séparé et fatalement, il peut être disposé avant que le résultat de la requête ne soit traité dans la vue. Pour pallier ça, il suffit d’essayer de forcer une itération juste après l’appel de la requête link pour obliger celle-ci à s’exécuter immédiatement. Je ne sais pas si cela est ton problème mais tu peux essayer de regarder dans cette direction.

Pour ma part, toujours dans le .NET6 et en plein développement d’une IMH pour une nouvelle machine équipée d’un PLC Siemens S1500 en OPC UA.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Arduino-RPI
Messages : 24
Enregistré le : mar. 26 mai 2020 15:21

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par Arduino-RPI » mar. 8 mars 2022 08:39

Hello Bud,
Merci pour ton retour.
Les "dispose" sont générés surtout en plein traitements (assez longs) et non sur des "rendus" de vue.
Aucun bloc using n'est utilisé dans l'appli. C'est le framework ninject qui appelle les dispose au travers des configurations InRequestScope()
J'avoue qu'il y a pas mal d'amélioration à faire...
Je continue d'investiguer.
Par rapport aux lenteurs d'entity que je rencontre, je suis assez étonné qu'avec une config par defaut d'entity on est sur des traitements X4 voir X5 par rapport a des requetes pures SQL. Par ex, j'ai utilisé pour une fonction d'import en masse (select + insert) en base sql, un framework type Dapper et le resultat est assez probant (passé de 13min d'import a 1m20sec). Donc, du boulot la dessus aussi...
________________
Par rapport a .Net6 pour ton IHM, toujours sur du Blazor ? Je me forme a Blazor depuis quelques mois et je trouve la techno vraiment intéressante.
J'ai l'impression qu'on l'a trouve de plus en plus dans des projets pro, les "services" IT s'y mettent vraiment.
Toujours preneur des retours de tes projets ;)

Bud Spencer
Raspinaute
Messages : 1069
Enregistré le : lun. 15 août 2016 21:38

Re: .Net Core 3.0 puis .Net 5 (C#,F#, Visual basic .Net)

Message par Bud Spencer » mer. 9 mars 2022 10:11

Je ne me souviens pas avoir utilisé ninject pour des dépendances dbcontext entity, donc je ne peux guère t’être d’une grande aide sur ce genre de cas, mais je trouve vraiment très surprenant cet énorme écart de résultats entre du sql pure et entity. Perso, j’avais fait il y a déjà pas mal de temps des tests sur les 2 méthodes sur des tables de plusieurs dizaines de milliers d’enregistrements avec des jointures aussi bien en select, insert et update et je n’avais pas constaté de telles différences. Cela dit, j’ai été longtemps retissant à utiliser Entity parce que je trouvais il y a encore quelques années que cela manquait de maturité et j’avais parfois des résultats étranges. Finalement, je ne l’ai vraiment adopté que depuis Net Core pour des petits projets qui ne dépassent pas une centaine de tables et jusque-là, je trouve que cela va plutôt très bien (en tous cas, avec du sql server).

Pour ce qui est de mon dev d’IHM du moment, je suis resté sur du Winforms avec .NET6. J’aurais aimé faire ça avec des consoles indus client web et blazor, mais j’ai beaucoup de composants graphique qui sont déjà sur d’autres machines du même type et que je réutilise. C'est dut au fait que la façon dont je doit travailler est un peut particulière. Nous recevons une nouvelle machine qui dispose déjà de sa propre IHM et qui est mise très rapidement en production. De mon coté, je dois redévelopper rapidement une autre IHM pour l'intégrer à la GPAO de l'ERP et tout ca pendant que la machine produit ... Donc pas trop de temps pour expérimenter et je dois profiter de l'existant. Je reste cependant de plus en plus convaincu que blazor serait un très bon choix aussi pour ce genre d’application.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Autres langages »