Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

C# Scripting ajoutez de la vie dans vos applications !

[new:30/07/2014]C# ce merveilleux langage… On aimerait souvent pouvoir l’utiliser comme outil de scripting dans les applications. Grâce à CS-Script cela est tout à fait possible. Gratuitement…

Pourquoi “Scripter”

Comme je l’indiquais en introduction, l’une des principales utilisation du scripting est de pouvoir étendre le paramétrage et ajouter des extensions à des applications pour les rendre plus souples et plus versatiles. Ce mode d’extension réclame souvent un niveau que l’utilisateur final ne possède pas et il reste plutôt utilisé par les développeurs eux-mêmes pour personnaliser un logiciel aux besoin spécifiques d’un client.

Néanmoins lorsqu’on s’adresse à une population d’utilisateurs “experts”, la mise à disposition d’un scripting de qualité a toujours été l’apanage des “grands” logiciels. Les macros de Word ou Excel, les extensions en python de Blender, les scripts Photoshop, etc, quel que soit le langage choisi tout logiciel d’une certaine envergure possède un mode scripting.

Scripter peut aussi être utile pour créer des extensions à la Console ou simplement tester facilement des bouts de code sans sortir tout l’arsenal officiel dont Visual Studio ou Xamarin Studio…

CS-Script

CS-Script est parti d’un article dans Code Project en septembre 2009. Une sorte de POC, d’exercice de style.

Mais l’intérêt était tel que ce petit projet a vite évolué et est devenu un véritable outil utilisé un peu partout dans le monde pour étendre des applications ou pour servir d’environnement de test de code rapide.

Aujourd’hui c’est un projet Open-Source sous licence MIT l’une des plus permissives qui existe puisque tout est permis sauf d’oublier d’ajouter un lien vers la licence MIT. Bref cela est un peu comme s’il n’y avait pas de licence mais en réalité elle existe et protège les auteurs en leur donnant le droit de faire ce qu’ils veulent du code source tout en ne conférant aucun droit de réclamation à l’utilisateur. Cela n’est pas forcément légal dans le cadre juridique Européen et Français surtout s’il y a vente d’un produit. Mais ces aspects juridiques ne sont pas l’essentiel de mon propos d’aujourd’hui.

Techniquement ?

CS-Script se présente comme l’implémentation d’un système de scripting basé sur la définition ECMA de C# basé sur un CLR (Common Language Runtime).

Actuellement CS-Script cible les implémentations Microsoft du CLR (.NET 2.0; 3.0; 3.5; 4.0; 4.5) ainsi que Mono.

Dans la pratique ?

Dans la pratique CS-Script se présente sous la forme soit de binaires soit de code source.

Beaucoup de produits gratuits ou commerciaux l’utilisent, comme par exemple MediaPortal, portail de l’Open Source, FlashDevelop, qui est un EDI de développement Open Source, etc.

On trouve même, et c’est là que cela devient intéressant au quotidien, une extension pour NotePad++ qui permet d’obtenir depuis ce dernier un environnement totalement fonctionnel pour écrire et exécuter du C# !

CS-Script + Notepad++

Nodepad++ est une super éditeur de code externe, c’est à dire autonome (en opposition aux éditeurs intégrés à Visual Studio par exemple). C’est plutôt un bloc-notes Windows qui aurait été adapté à la saisie de code. Aussi facile et rapide à invoquer et utiliser que le bloc-notes mais presque aussi complet qu’un éditeur d’EDI professionnel.

J’ai toujours utilisé Notepad2 pour remplacer le bloc-notes de Windows car il sait faire du syntax highlighting ce qui est pratique quand on ouvre un fichier html, xaml, csharp, etc. Mais depuis Notepad++ est bien plus complet et surtout il s’ouvre au mariage avec CS-Script pour devenir un mini EDI C# exécutant immédiatement le code…

Une fois Notepad++ installé (il existe des modes d’installation par simple copie fournis en Zip, donc pas de truc embrouillé qui en colle de partout sur le PC…) il suffit d’installer l’extension CS-Script pour Notepad++. Le site de cette extension se trouvant ici : cs-script.Npp. Notepad++ gère un petit système de plugin à la Nuget ce qui facilite l’installation des extensions (nombreuses dont certaines vraiment bien).

L’avantage est bien entendu de disposer d’une petite application aussi légère qu’un bloc-notes, rapide à exécuter, gérant la syntaxe de C# et la mise en forme du texte parfaitement mais intégrant en plus un module d’exécution du code tapé ! Une sorte de mini Visual Studio de poche ultra pratique pour tester une idée, un bout de code, codé sur une machine qui n’a pas VS, etc.

L’extension actuelle ajoute même Intellisense et c’est là que les choses deviennent vraiment pratiques car le framework est tellement vaste qu’on a du mal à tout retenir de chaque namespace, de chaque classe… Le petit GIF ci-dessous montre tout cela en mouvement (c’est plus sympathique !).

css_npp

 

Le système est tellement bien conçu et complet qu’on obtient à l’arrivée plus qu’une sorte de console pour tester trois lignes de C# mais bel et bien un environnement de développement gratuit, prenant peu de place, et fournissant l’essentiel pour travailler ou tester des idées sophistiquées. D’ailleurs quand on regarde le look final de Notepad++ intégrant le mode CS-Script on dirait vraiment un EDI classique :

CSScript

Mais je ne vais pas tout vous faire voir, je vous laisse le plaisir de découvrir tout ça par vous-mêmes !

Exécution en mode command-prompt

CS-Script peut aussi exécuter du code C# avec un clic droit dans l’explorateur de fichiers Windows, cela est très pratique dès lors qu’on se créée des librairies de code de test par exemple :

menu

Script hosting

Beaucoup de lecteurs seront certainement plus intéressés par cette utilisation de CS-Script : ajouter du scripting dans une application !

En réalité c’est d’une facilité déconcertante. Une fois la librairie placée dans les références du projet on peut exécuter tout code scripté et recueillir les résultats éventuels en quelques instructions. Voici quelques exemples :

Exécution d’un script contenant la définition d’une classe

dynamic script = CSScript.Evaluator
                         .LoadCode(@"using System;
                                     public class Script
                                     {
                                         public int Sum(int a, int b)
                                         {
                                             return a+b;
                                         }
                                     }");
int result = script.Sum(1, 2);

 

Exécution d’un script ne contenant qu’une définition de méthode

dynamic script = CSScript.Evaluator
                         .LoadMethod(@"void SayHello(string greeting)
                                       {
                                           Console.WriteLine(greeting);
                                       }");
script.SayHello("Hello World!");

 

ou bien

ar Product = CSScript.Evaluator
                      .CreateDelegate(@"int Product(int a, int b)
                                        {
                                            return a * b;
                                        }");
int result = (int)Product(1, 2);

 

ou encore

int result = (int)CSScript.Evaluator.Evaluate("1 + 2");
CSScript.Evaluator.Run("using System;");
CSScript.Evaluator.Run("Console.WriteLine(\"Hello World\\")");

 

Vous retrouverez ces exemples et bien d’autres informations sur le site de CS-Script.

Les scripts peuvent être stockés sur disque, dans le cloud, être générés à la volée, tapés par l’utilisateur, sauvegardés dans une base de données, bref tout est possible et ce sont bien des horizons totalement nouveaux qui s’ouvrent !

Notepad++/CS-Script vs LinqPad

On ne peut s’interdire une telle comparaison. Les deux approches sont similaires : un exécutable et ses dll utilisable sans besoin d’une installation complexe, exécution et débogue de code C# sous .NET, etc.

On notera tout de même les différences suivantes :

  • Notepad++ et CS-Script sont totalement Open Source et gratuits, LinqPad est propriétaire, les sources ne sont pas disponibles.
  • Npp/CS offre Intellisense là où il faut acheter une licence Pro ou Premium de LinqPad pour bénéficier de cette aide indispensable.
  • LinqPad reste très orienté LINQ et est parfaitement adapté aux tests de requêtes de ce type. Il sait même utiliser les dll Entity Framework de vos projet pour autoriser des tests directs de ces dernières.
  • LinqPad n’offre aucun support de type scripting et code le code est fermé on ne peut pas s’en inspirer là où CS-Script peut s’intégrer à vos applications.

 

Peut-on départager les deux produits ? J’en doute. Chacun a ses forces et faiblesses. Pour faire des tests rapides de C# les deux se valent même si à l’utilisation Npp+CS-Script grâce à Intellisense s’avèrent plus pratiques. LinqPad le fait mais il faut alors la version payante…

Pour tester du LINQ, LinqPad est supérieur.

Mais si on ne parle que de scripting, SC-Script prend l’avantage puisqu’il est utilisable en dehors de Notepad++ là où le module intégré à LinqPad n’est qu’un appel aux API du compilateur Microsoft.

Conclusion

On a souvent besoin de tester un bout de code. LinqPad est très utile pour cela, mais Notepad++ avec l’extension CS-Script le fait aussi bien avec Intellisense en prime et en offrant les possibilités d’un véritable éditeur de texte permettant de travailler aussi sur du XML, du JSON, etc.

Mais Notepad++ n’était pas mon propos ici mais SC-Script. Et là ne parlons plus de rien d’autre car il n’y a pas d’équivalence gratuite aussi bien achevée que SC-Scripting pour ajouter un mode script aux applications. Notepad++ et CS-Script sont deux produits différents et ils peuvent parfaitement s’utiliser l’un sans l’autre, il est utile de le préciser.

Mais d’une pierre deux coups, d’un côté vous vous offrez pour rien un mini EDI pour tester du C#, de l’autre un système de scripting super efficace pour étendre vos applications !

Ces produits sont tous dans ma boîte à outils et je m’en sers très régulièrement. Si cela peut vous rendre service aussi alors ce billet aura atteint son objectif !

Vive C# … et …

Stay Tuned !

Faites des heureux, partagez l'article !
blog comments powered by Disqus