38 votes

Interprète C # (sans compilation)

Est-il prêt à utiliser C# interprète là, c'est de ne pas se prévaloir de l'exécution de la compilation?

Mes besoins sont les suivants :

  • Un moteur de script
  • Doit Gérer la syntaxe C#
  • Devons travailler sur le moyen-environnements de confiance
  • Ne doit pas utiliser la compilation d'exécution (CodeDomProvider ...)
  • Open source (ou au moins gratuit à la fois pour une utilisation personnelle et professionnelle)

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

Merci pour votre aide.

18voto

Mitch Wheat Points 169614

Avez-vous consulté paxScript.NET ?

12voto

Luke Quinane Points 8257

Découvrez le Mono projet. Ils ont récemment démontré CsharpRepl qui ressemble à ce que vous êtes après. La PDC 2008 vidéo ici.


Mise à jour:

Sur un regard de près, il semble que l'aide de Mono.CSharp service pour évaluer les scripts ne pas être possible. Actuellement, il est lié à la Mono exécution et qu'ils ne s'y attendent pas à s'exécuter dans une confiance moyenne de l'environnement. Voir cette discussion pour plus d'info.

Sur l'autre possibilité est d'inclure le Mono compilateur C# (sources ici) dans votre projet et l'utiliser pour créer des assemblages que vous chargez à partir du système de fichiers. Vous êtes inquiet sur les ressources nécessaires pour charger tous ces assemblées, vous pourriez avoir à les charger dans un autre domaine d'application.

5voto

Jason Points 31

J'ai besoin d'évaluer 10000+ petit les scripts qui sont tous différents, la compilation de tous serait juste ralentir considérablement

Interpretting ces serait encore plus douloureusement lent. Nous avons un problème similaire, nous adresse est la suivante:

Nous utilisons l'Or Analyseur de projet pour analyser le code source et les convertir en un format XML génériques de la langue". Nous courons à travers une transformation qui génère VB.Net le code source (tout simplement parce qu'il est insensible à la casse). Nous avons ensuite compiler à l'aide de l' .Net runtime dans un autonome DLL, et appeler cela aide fortement restreint l'accès.

On dirait que vous êtes la création de quelque chose comme un site web dynamique où les gens peuvent créer des modules ou des extraits de la fonctionnalité, mais à l'aide de C# pour faire cela introduit un couple des principaux problèmes; C# doit être compilé, et la seule façon de contourner cela est d'interpet lors de l'exécution, et ce n'est pas faisable, et même si vous ne compiler chaque extrait puis vous vous retrouvez avec 10 000 Dll, ce qui est peu pratique et inutilisable.

Si vos extraits sont rarement changement, alors je considère en programmant les enveloppant dans un ensemble unique de source, chacun ayant un nom unique, puis de les compiler en un seul coup (ou comme un temps de traiter toutes les 10 minutes?). C'est ce que nous faisons, car il permet de versioning " des peuples des séances de sorte qu'ils continuent à l'aide de la version de la DLL qu'ils avaient au début de leur session, mais lors de chaque session de cesse d'utiliser une ancienne version, il est supprimé.

Si vos extraits de changer régulièrement tout au long de la journée, alors je vous suggère de regarder un interpretted langage de script au lieu de cela, même en PHP, et le mixage de vos langues selon les fonctionnalités dont vous avez besoin. Des produits tels que CScript et LinqPad utilisent tous le CodeDomProvider, parce que vous devez avoir IMSL quelque part, si vous voulez le programme compilé logique.

La seule autre option est d'écrire votre propre interpretter et utiliser la réflexion pour accéder à toutes les autres bibliothèques, vous devez d'accès, mais c'est extrêmement complexe et horrible.

En tant que vos conditions sont effectivement conclue, je vous conseille de prendre un peu de recul et de trouver un moyen de retrait d'une ou de plusieurs restrictions. Si vous trouvez un FullTrust environnement pour compiler vos extraits dans, éliminer le besoin de code complet de soutien (p. ex. le passage à interpretted extrait de code de support), ou même de changer l'ensemble du cadre de quelque chose de non .Net.

4voto

Jason Marcell Points 965

LINQPad peut fonctionner comme un fragment de code IDE. L'application est très petit et léger. Il est gratuit (comme dans la bière), mais pas open-source. Auto-complétion des coûts supplémentaires, mais pas beaucoup ($19).

Edit: après avoir lu sur les commentaires de ce post un peu plus attentivement, je ne pense pas que LINQPad est ce que vous voulez. Vous avez besoin de quelque chose qui peut par programmation évaluer les milliers de petits scripts de manière dynamique, à droite? Je l'ai fait au travail à l'aide de Fer Rubis très facilement. Si vous êtes prêt à utiliser un langage DLR, ce serait sans doute plus réaliste. J'ai aussi fait quelques travaux similaires avec un code qui pourrait évaluer un C# expression lambda transmis sous la forme d'une chaîne de caractères, mais qui était extrêmement limitée.

4voto

Davide Icardi Points 2215

J'ai écrit un projet open source, Dynamique Expresso, que peut convertir le texte en expression écrite à l'aide d'une syntaxe C# dans délégués (ou de l'expression de l'arbre). Les Expressions sont analysées et transformées en Arbres d'Expression sans l'aide de la compilation ou de 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 Scott Gu article http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X