.Net Core 3.0 à .Net 8 (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 : 1089
Enregistré le : lun. 15 août 2016 21:38

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

Message par Bud Spencer » jeu. 19 déc. 2019 21:10

Mise à jour en version 3.1 (LTS) sur raspbian
On trouve le lien pour Linux ARM32 et on le télécharge avec CURL :

curl -SL -o dotnet.tar.gz https://download.visualstudio.microsoft ... arm.tar.gz

On decomp. tout ça avec une commande tar classique : curl -SL -o dotnet.tar.gz …
(Pour une Install directe de la version, se reporter page 1 et juste changer l’url du lien).

Dans Visual Studio (à jour), on clic droit sur le projet (MyApp) ->Propriété et dans l’onglet application, on cible la version 3.1. On peut ensuite ‘Gerer les packages NuGet’ pour voir si il y a des updates de ceux-ci et les installer d'un simple clic de souris.
up31.png
up31.png (174.86 Kio) Vu 5447 fois
… et si on veut virer les version 3.0 sur le raspbian, il suffit de supprimer les répertoires … :
sudo rm -rf /usr/share/dotnet/shared/Microsoft.NETCore.App/3.0.0
sudo rm -rf /usr/share/dotnet/shared/Microsoft.AspNetCore.App/3.0.0
et d'avoir la confirmation par un nouveau dotnet --info
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

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

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

Message par Bud Spencer » dim. 22 déc. 2019 20:10

Juste pour s’amuser, voyons voir comment s’en sort .Net Core 3 avec quelques itérations (416181953 pour etre exact). Le but de ce code n’est pas de trouver le résultat le plus vite possible (ce que l’on peut faire en quelques µ seconde) mais bien de le forcer à itérer et à évaluer. La boucle du test :
b1.png
b1.png (6.89 Kio) Vu 5429 fois
A l’exception de la librairie qui mesure le temps et qui est spécifique à chaque langage, tous les types sont strict et identique (sauf pour python et js avec leurs typage fantôme) et le code de la boucle est un copié collé pour tous les exemples (sauf pour python ou il a fallu adapter la syntaxe). Le temps d’exécution retourné ne tient compte que du code la boucle et est la moyenne de 3 essais différents pour chaque langage sur un PI3 Raspbian Buster.

JS (Node 12.13.0) : 17 Secondes
C++ (GCC 8.3.0) : 34 secondes
C# (.Net Core 3.1.0) : 38 secondes
Java (openjdk 1.8.0) : 132 secondes
Python 2 (2.7.16) : 876 secondes
Python 3 (3.7.3 ) : 1213 secondes

sur mon pc (w10, bi-xeon 5660, 64gb ram) avec .Net Core 3.1.0 : 6 secondes.

Etonnant non :D

Bien sûr cela ne reflète pas grand-chose, mais quand meme ….
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

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

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

Message par Bud Spencer » lun. 23 déc. 2019 10:31

Si le SDK est installé on peut coder directement sur Pi en utilisant les outils CLI de .Net Core et un simple éditeur de code.
On utilise la commande dotnet new console –o nomduprogramme pour créer le projet.
Ensuite on entre dans le répertoire et on édite le fichier Program.cs (c’est qui contient le main()).
On peut exécuter le code avec la commande dotnet run.
Quand tout fonctionne comme prévue on utilise la commande dotnet publish –c Release pour générer la sortie.

Il y a plein d’options avec ces commandes et on peut meme depuis le PI créer des build qui cible n’importe quel autre OS pris en charge. Par exemple, la commande suivante créera la sortie pour un windows 10 64 bits : dotnet publish –c Release –r win10-x64.
Voilà ce que ça donne pour le bench décrit plus haut :
bcli.png
bcli.png (49.03 Kio) Vu 5412 fois
Et le code édité avec nano

Code : Tout sélectionner

using System;
using System.Diagnostics;

namespace benchcs
{
    class Program
    {
        static void Main(string[] args)
        {           
            Stopwatch t = new Stopwatch();

            int i = 0;
            int x = 20;
            long z = 0;
            long l = x;
            bool b = false;            
            
            t.Start();

            while (!b)
            {
                b = true;
                i = 2;
                while ((i < x + 1) && b)
                {
                    b = l % i != 0 ? false : b;
                    i++;
                    z++;
                }
                l++;
            }

            t.Stop();            
            
            Console.WriteLine(
                "C# | Itérations: " + (z-1).ToString() + 
                "  Résult: " + (l-1) + 
                "   Temps: {0:f} ",(float)t.ElapsedMilliseconds / 1000
                );
        }        
    }
}




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

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

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

Message par Bud Spencer » lun. 30 déc. 2019 13:32

Aller une petite dernière pour 2019. Ajout d'exposition d'API à mon application en restant sur concept MVC. Je vais ajouter de quoi récupérer des valeurs des canaux du mcp3208 que j’avais mis dans le conteneur de dépendance (1) en utilisant une requête HTTP GET. Pour que le programme reste bien structuré (très important ça), j’ajoutes 2 répertoires à mon projet que j’appelle respectivement Models et Controllers (2) et je dis à mon application qu’elle a un nouveau point d’entrée qui va pointer vers mes contrôleurs(3).
addapimvc.png
addapimvc.png (69.55 Kio) Vu 5360 fois
Modifié en dernier par Bud Spencer le lun. 30 déc. 2019 16:54, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

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

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

Message par Bud Spencer » lun. 30 déc. 2019 13:44

Le model :

Dans Models, je crée une classe j’appelle Analogique.cs en lui imposant 3 valeurs en paramètre dans le constructeur et j’ajoute 2 propriétés. Une première (Digital) pour initialiser et récupérer la valeur Numérique du canal et une seconde (Analog) pour récupérer la valeur Analogique en Volt. Quand on a juste quelques dizaine d’objets dans un programme on garde facilement en tête ce que sont leur différents paramètres et propriétés, mais quand on commence à en avoir plusieurs centaines voire milliers, ça peut vite se compliquer. De plus Ces objet peuvent se trouver dans une librairie séparée et on n’a pas forcement accès au code. Le rôle des décorateur summary (facultatif) , c’est de commenter ce qui a besoin de l’etre de façon à renseigner dynamiquement l’utilisateur de l’objet à la saisie de son code. On peut aussi ajouter tout un tas d’attributs pour par exemple formater les valeurs serializable ou definir ce qui doit etre serializé ou pas.
mvcmodel.png
mvcmodel.png (47.64 Kio) Vu 5368 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

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

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

Message par Bud Spencer » lun. 30 déc. 2019 13:57

Le controleur :

Après le model, je créé un contrôleur que j’appelle AnalogiqueController. Depuis VS, on peut créer cliquement des contrôleurs qui contiennent toutes les instructions crud necessaire, des contrôleurs vide et meme des contrôleurs contenant toutes les fonctions pour interfacer un contexte de données avec EF (Entity Framework). Pour ca click droit sur le dossier Controllers->Ajouter->Controleur … (on peut aussi le créer à la main puisque comme tout le reste, c'est une classe). Ici je choisi un vide et je lui ajoute manuellement un fonction HttpGet). Il hérite automatiquement de ControleurBase et possède des attributs définissants sa route et que c’est un contrôleur d’API. L’injection de l’ADC se fait comme précédemment, c’est-à-dire par le constructeur et je n’ai plus qua créer des fonctions (GET,PUT,DELETE,POST …) . Ici juste un GET d’exemple qui attend un n° de canal de l’adc en paramètre. Depuis C# 5, plus besoin de créer de thread ni de background worker ni meme de subprocess pour rendre des appels non bloquant. Ici l’appel de la fonction et la lecture de l’ADC sont rendu asynchrone avec les instructions await/async et Task. Pas non plus besoin de sérializé l’objet à retourner, l’attribut ApiContoller fait tout le boulot y compris pour les status de réponse.
mvccontroller.png
mvccontroller.png (48.07 Kio) Vu 5367 fois
Modifié en dernier par Bud Spencer le lun. 30 déc. 2019 14:17, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

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

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

Message par Bud Spencer » lun. 30 déc. 2019 14:13

Je publie l’application sur le PI et désormais j’accède à mon api depuis tout ce qui est capable de faire des requetes http Get sur l’url http://ipdupi/api/controleur/parametres....
apiout.png
apiout.png (31.73 Kio) Vu 5367 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

ChPr
Messages : 40
Enregistré le : ven. 29 mars 2019 14:36

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

Message par ChPr » jeu. 2 janv. 2020 11:50

J'ai survolé ce fil où il apparaît que .NET Core semble très puissant et bien adapté pour le Raspberry Pi 3B.

Néanmoins, avec cet environnement de développement est-il aisé de réaliser une interface graphique telle que celle ci-dessous (réalisée avec Free Pascal Lazarus) en quelques clicks avec des composants prédéfinis ou bien faut-il les construire, les faire venir de bibliothèques, ...

Cordialement.

Pierre
Fichiers joints
Ecran_GPS.jpg
Ecran_GPS.jpg (383.29 Kio) Vu 5338 fois

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

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

Message par Bud Spencer » jeu. 2 janv. 2020 19:38

Bien sûr. VS possède un puissant concepteur graphique qui permet de dessiner des GUI portable (oupas). Mon seul regret (et celui d’un très grand nombre de développeurs) c’est que l’on ne pourra jamais profiter de toutes sa richesse sous linux ou mac comme on le fait sous Windows (encore que l’espoir subsiste …). Cela dit, ces restrictions sur sa portabilité sont moindres comparé à celle de Lazarus. Donc oui, aucun problème pour dessiner ce genre de truc en ‘quelques click’ avec VS et le faire tourner sous n’importe quel plateformes (et j’ajoute : sans meme avoir à compiler pour chacune d’elle).

Après il faut bien différencier le langage (ici du C#), le Framework utilisé (Ici .Net Core) et l’IDE (ici Visual Studio). En terme d’IDE (puisque l’on parle de concepteur graphique avec implémentation de code), si Lazarus était un vieux ballon de foot, Visual Studio serait le Stade Maracana et tout ce qu’il y a dedans un soir de coupe du monde de football du futur. Si le Pascal était une cuillère en bois, le C# serait un Termomix. Le pascal est un langage académique mort (ce qui ne retire rien à ses qualités), alors que le C# est un langage moderne résolument tourné vers l’avenir.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

cbalo

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

Message par cbalo » jeu. 2 janv. 2020 20:44

Cela dit, ces restrictions sur sa portabilité sont moindres comparé à celle de Lazarus
Je ne suis pas tout à fait d'accord.
Les restrictions concernant la portabilité windows <=> Linux d'un code en Pascal Objet sont levées dès que :
- on n'utilise pas d'api spécifique à windows
- on n'utilise pas la base de registre de windows
- on n'utilise pas de chemin windozien en dur

Et concernant le développement d'applications GUI de dites web de services, de drivers etc..., en pascal, il y a Embarcadero Rad Studio qui fait tout, y compris des applis pour Android, IOS etc...
C'est l'IDE qui propose le plus de composants dans sa version d'origine.
Et le nombre de composants optionnels disponibles est absolument ahurissant.
Rad Studio existe aussi pour C++.

Quand à parler de langages "modernes", pour moi ce terme n'est pas une preuve de qualité on a vu moultes langages modernes passés aussi rapidement aux oubliettes qu'ils étaient arrivés.
C# n'est qu'un C++ amélioré (donc qui date des années 90), lui même issu du C (qui date des années 70).
COBOL : date des années 60, on n'a pourtant rien trouvé d'assez performant pour le remplacer (rapprochement de n fichiers de prêt 1 millions d'enregistrement en 10 minutes, qui dit mieux ?)

Le fait de pouvoir tout faire et bien c'est même pas suffisant : il faut aussi que l'éditeur adopte la compatibilité ascendante.
Il n'y a rien de pire que de devoir réécrire toute une application pour la faire évoluée suite à un changement d'environnement.
Je pratique le Pascal object depuis Delphi 4.0 (1994), et chaque migration s'est fait en douceur.

Je ne dirais pas ça du php (migration 3.x-4.x dans la douleur, rebelotte pour la 5.x et rebelotte pour la 7.x )!! ni de python (attention migration 2.x vers 3.x !!)
Le pire dans ce domaine est MySQL (langage PL/SQL) : un cauchemar pour passer de la 4.x à la 5.x, le même pour passer à la 6.x , rebelote pour la 7.x et on recommence pour la 8.x
Le meilleur dans le domaine du PL/SQL est surement Firebird : aucun changement à faire si ce n'est la gestion des comptes utilisateurs en 15 ans !!)

Il faut aussi que le déploiement de l'application soit aisée (exit l'installation des msvc dans telle ou telle version)

Bref, je ne critique pas directement l'environnement que tu utilises, je dis juste que c'est beau mais l'avenir dira si c'est vraiment la perle rare.

Répondre

Retourner vers « Autres langages »