web-dev-qa-db-fra.com

Interprète C # (sans compilation)

Existe-t-il un interpréteur C # prêt à l'emploi, qui ne repose pas sur la compilation à l'exécution?

Mes exigences sont:

  • Un moteur de script
  • Doit gérer la syntaxe C #
  • Doit travailler sur des environnements de confiance moyenne
  • Ne pas utiliser la compilation à l'exécution (CodeDomProvider ...) 
  • Open source (ou du moins gratuit pour un usage personnel et professionnel)

Si ce n'est pas clair, j'ai besoin de quelque chose comme Jint ( http://jint.codeplex.com/ ), mais qui me permet d'écrire des scripts C # au lieu de JavaScript.

Merci de votre aide.

36

Avez-vous examiné paxScript.NET ?

18
Mitch Wheat

Découvrez le projet Mono . Ils ont récemment fait une démonstration de CsharpRepl qui ressemble à ce que vous cherchez. La PDC 2008 vidéo ici _.


Mettre à jour:
De près, il semble que l’utilisation du service Mono.CSharp pour évaluer les scripts ne soit pas possible. Actuellement, il est lié à l'exécution Mono et ils ne s'attendent pas à ce qu'il s'exécute dans un environnement de confiance moyenne. Voir cette discussion } _ pour plus d'informations.

Une autre possibilité consiste à inclure le compilateur Mono C # _ (sources ici ) dans votre projet et à l'utiliser pour générer des assemblys que vous chargez à partir du système de fichiers. Si vous êtes préoccupé par les ressources nécessaires pour charger tous ces assemblys, vous devrez peut-être les charger dans un AppDomain séparé.

12
Luke Quinane

Je dois évaluer 10000+ petits des scripts qui sont tous différents, les compiler tous serait juste dramatiquement lent

Les interpréter serait encore plus lent. Nous avons un problème similaire que nous abordons comme suit:

Nous utilisons le projet Gold Parser pour analyser le code source et le convertir en un «langage générique» basé sur XML. Nous exécutons cela via une transformation générant du code source VB.Net (simplement parce que c'est insensible à la casse). Nous les compilons ensuite à l’aide du runtime .Net en une DLL autonome et appelons cela à l’aide d’un accès fortement restreint.

On dirait que vous créez quelque chose comme un site Web dynamique où les gens peuvent créer des modules personnalisés ou des extraits de fonctionnalité, mais utiliser C # pour cela introduit quelques problèmes principaux; C # doit être compilé, et le seul moyen de contourner cela est de l'interpréter au moment de l'exécution, ce qui est irréalisable. Même si vous compilez chaque extrait, vous vous retrouvez avec 10 000 DLL, ce qui est impraticable et inutilisable.

Si vos extraits de code changent rarement, envisagez de les regrouper par programme dans un seul ensemble de sources, chacun portant un nom unique, puis de les compiler en un seul coup (ou sous forme de processus chronométré toutes les 10 minutes?). C’est ce que nous faisons, car cela permet également de «versionner» les sessions des personnes afin qu’elles continuent à utiliser la version de DLL qu’elles avaient au début de leur session, mais lorsque chaque session cesse d’utiliser une ancienne version, elle est supprimée.

Si vos extraits changent régulièrement au cours de la journée, je vous conseillerais plutôt de regarder un langage de script interprété, même PHP, et de mélanger vos langues en fonction des fonctionnalités dont vous avez besoin. Des produits tels que CScript et LinqPad utilisent tous CodeDomProvider, car vous devez avoir IMSL quelque part si vous souhaitez programmer la logique compilée.

La seule autre option consiste à écrire votre propre interpréteur et à utiliser la réflexion pour accéder à toutes les autres bibliothèques auxquelles vous avez besoin d'accéder, mais cela est extrêmement complexe et horrible.

Étant donné que vos exigences sont inatteignables, je vous suggère de prendre du recul et de trouver un moyen de supprimer une ou plusieurs restrictions. Que vous trouviez un environnement FullTrust pour compiler vos extraits, supprimez la nécessité d’une prise en charge complète du code (par exemple, passez à la prise en charge des extraits de code interprétée), ou modifiez même l’ensemble de la structure en quelque chose de non .Net.

5
Jason

J'ai écrit un projet open source, Dynamic Expresso , qui permet de convertir une expression textuelle écrite à l'aide d'une syntaxe C # en délégués (ou arborescence des expressions). Les expressions sont analysées et transformées en Arbres d'expression sans utiliser la compilation ou la réflexion.

Vous pouvez écrire quelque chose comme:

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

ou

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

Mon travail est basé sur l'article de Scott Gu http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library. aspx .

4
Davide Icardi

LINQPad peut fonctionner comme un IDE d’extrait de code. L'application est très petite et légère. C'est gratuit (comme dans la bière) mais pas open-source. La saisie automatique coûte extra mais pas beaucoup (19 $).

Edit: après avoir lu un peu plus attentivement les commentaires dans ce message, je ne pense pas que LINQPad est ce que vous voulez. Vous avez besoin de quelque chose qui puisse évaluer par programmation des milliers de petits scripts de manière dynamique, non? Je l'ai fait au travail en utilisant très facilement Iron Ruby. Si vous êtes prêt à utiliser un langage DLR, cela serait probablement plus faisable. J'ai également effectué des travaux similaires avec du code permettant d'évaluer une expression lambda C # transmise sous forme de chaîne, mais cela était extrêmement limité.

4
Jason Marcell

ou http://www.csscript.net/ Oleg écrivait une bonne introduction à code project

3
Marc Wittke

Il ne gère pas la syntaxe C # exacte, mais PowerShell est si bien incorporé au framework .NET et constitue un produit aussi abouti que je ne pense pas qu'il soit prudent de l’ignorer au moins comme solution possible. La plupart des produits serveur mis au point par Microsoft prennent désormais en charge PowerShell pour leur interface de script, notamment Microsoft Exchange et Microsoft SQL Server.

1
Lee

Celui-ci fonctionne très bien c # repl et interprète interactif

0
Barton

Je crois que Mono a mint, un interprète qu’ils utilisent avant de mettre en œuvre l’ECM pour une plate-forme donnée. Bien que les documents du site officiel (par exemple, Runtime ) indiquent qu’il s’agit simplement d’un état intermédiaire avant de consolider la machine virtuelle jitting, je suis à peu près sûr que c’était là la dernière fois que je l’ai compilé sous Linux. Malheureusement, je ne peux pas le vérifier pour l'instant, mais c'est peut-être dans la direction souhaitée.

0
dodecaphonic

bungee # est la chose que vous voulez, dans peu de temps, Bungee Sharp sera un projet open source dans 

http://www.crssoft.com/Services/Bungee

. vous pouvez créer des scripts avec la même syntaxe c #. il n'y a pas de création d'assembly lorsque vous exécutez le script, l'interprétation se fait à la volée, donc les performances sont élevées. tous les mots-clés sont disponibles comme c #. J'espère que vous l'aimerez beaucoup ..

0
Burcu Co

J'ai rencontré le même problème. Dans un projet, je cherchais à fournir un moyen générique de spécifier des conditions contrôlant le moment où une certaine lettre devait être générée. Dans un autre projet, les conditions contrôlaient la façon dont les cas étaient affectés aux files d'attente. Dans les deux cas, la solution suivante a parfaitement fonctionné:

  1. Le langage pour les extraits - J'ai choisi JScript pour ne pas avoir à me soucier des types de variable.
  2. La compilation - oui, il faut une confiance totale, mais vous pouvez placer votre code dans une assemblée distincte et lui donner toute confiance. N'oubliez pas de le marquer avec l'attribut AllowPartiallyTrustedCaller.
  3. Nombre d'extraits de code - j'ai traité chaque extrait comme une méthode et non comme une classe. De cette façon, plusieurs méthodes peuvent être combinées en un seul assemblage
  4. Utilisation du disque - J'ai effectué toute la compilation en mémoire sans enregistrer l'ensemble sur le disque. Cela aide aussi si vous avez besoin de le recharger.

Tout cela fonctionne en production sans aucun problème

Modifier

Juste pour clarifier 'snippet' - Les conditions dont je parle ne sont que des expressions booléennes. J'ajoute par programme du texte supplémentaire pour le transformer en méthodes et méthodes en classes compilables.

De même, je peux faire la même chose avec C # bien que je pense toujours que JScript est préférable pour les extraits de code.

Et BTW mon code est open source, n'hésitez pas à parcourir . Gardez simplement à l'esprit qu'il y a beaucoup de codes non liés à cette discussion. Faites-moi savoir si vous avez besoin d'aide pour localiser les éléments concernant le sujet 

0
mfeingold