web-dev-qa-db-fra.com

Intégration du moteur JavaScript dans .NET

je me demandais simplement si quelqu'un avait déjà essayé d'intégrer et d'intégrer un moteur JS dans l'environnement .net. Je pourrais trouver et utiliser réellement (après unBEAUCOUPde douleur et d'effort, car il est assez démodé et pas tout à fait fini) le projet spidermonkey-dotnet. Quelqu'un avec de l'expérience dans ce domaine? Des moteurs comme SquirrelFish, V8 .. 

Pas que je ne sois pas satisfait de Spidermonkey de Mozilla (l’utiliser pour miniframework de type Rails pour des composants personnalisés à l’intérieur de l’application ASP.NET principale), mais j'aimerais quand même explorer un peu plus loin les options. Les solutions de ligne de commande ne sont pas ce dont j'avais besoin, je ne peux pas compter sur autre chose que CLR, je dois appeler des méthodes depuis/vers des objets JavaScript/C #.

// c# class
public class A
{
    public string Hello(string msg)
    {
        return msg + " whatewer";
    }
}

// js snippet
var a = new A();
console.log(a.Hello('Call me')); // i have a console.log implemented, don't worry, it's not a client-side code :)

Juste pour clarifier - je n'essaye pas de programmer l'application elle-même en javascript côté serveur. Il est utilisé uniquement pour l'écriture de sous-applications utilisateur personnalisées (peut être considéré comme une sorte de DSL). Il est beaucoup plus facile (et plus sûr) d'autoriser les gens normaux à programmer en js qu'en C #.

206
aprilchild

Essayez Javascript .NET . Il est hébergé sur GitHub. Il était initialement hébergé sur CodePlex, ici )

Discussions du projet: http://javascriptdotnet.codeplex.com/discussions

Il implémente Google V8. Vous pouvez compiler et exécuter JavaScript directement à partir du code .NET avec celui-ci et fournir des objets CLI devant être utilisés par le code JavaScript. Il génère du code natif à partir de JavaScript.

94
Michel Boissé

L’interprète JavaScript open source Jint ( http://jint.codeplex.com ) fait exactement ce que vous recherchez.

Modifier: 
Le projet a été entièrement réécrit et est maintenant hébergé sur Github à l’adresse https://github.com/sebastienros/jint

81

Vous pouvez également être intéressé par Microsoft ClearScript , Hébergé sur GitHub et publié sous la licence Ms-Pl.

Je ne suis pas un fan de Microsoft, mais je dois admettre que le support de la V8 a à peu près les mêmes fonctionnalités que Javascript.Net, et plus important encore, le projet est toujours maintenu. En ce qui me concerne, l’aide aux délégués fonctionne également mieux qu’avec Spidermonkey-dotnet.

ps: Il prend également en charge JScript et VBScript, mais nous ne sommes pas intéressés par ce vieux produit.

ps: Il est compatible avec .NET 4.0 et 4.5+

48
JB.

Quiconque vient d’accorder un coup d’œil à Jurassic également: 

http://jurassic.codeplex.com/

edit: ceci est passé à github (et semble actif au premier abord)

https://github.com/paulbartrum/jurassic

37
bbqchickenrobot

Vous pouvez essayer ironJS, qui a l'air prometteur bien qu'il soit en plein développement. https://github.com/fholm/IronJS

8
Sergi Mansilla

Je suppose que je ne comprends toujours pas bien ce que vous essayez de faire, mais JScript.NET peut valoir la peine d’être examiné, bien que Managed JScript semble être plus adapté à vos besoins (il est plus comme JavaScript que JScript.NET).

Personnellement, je pensais que ce serait cool d'intégrer V8 d'une manière ou d'une autre, mais je n'ai pas oublié de télécharger le code source; J'aimerais avoir le temps de faire quelque chose avec.

7
Jason Bunting

Vous pouvez utiliser le moteur Chakra en C #. Voici un article sur msdn montrant comment:

http://code.msdn.Microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880

5
justin.m.chase

Si la langue ne pose pas de problème (n'importe quel scripté en mode bac à sable), il y a LUA for .NET . La version Silverlight du framework .NET est également une sandbox.

5
Chris S

Je suis venu avec une solution beaucoup plus simple à la place.

J'ai construit un fichier .dll à l'aide de Javascript, puis compilé à l'aide du compilateur Javascript disponible dans une invite de commande de développeur VS2013.

Une fois que nous avons le .dll, nous l’ajoutons simplement au dossier \Support, puis nous le référençons dans le projet qui devait évaluer les instructions Javascript.

Étapes détaillées pour créer un .dll:

  1. Créez un fichier dans le Bloc-notes avec uniquement le contenu suivant:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
    
  2. Enregistrez le fichier sous C:\MyEval.js

  3. Ouvrez une invite de commande VS2005 (Démarrer, Programmes, Outils VS2005, VS2005)

  4. Tapez Cd\ pour aller à C:\

  5. Type 

    jsc /t:library C:\MyEval.js
    
  6. Un nouveau fichier est créé nommé MyEval.dll.

  7. Copiez MyEval.dll dans le projet et faites-le référence (également référence Microsoft.Jscript.dll).

  8. Ensuite, vous devriez pouvoir l'appeler comme ceci:

    Dim jScriptEvaluator As New EvalClass
    Dim objResult As Object
    objResult = jScriptEvaluator.Evaluate(“1==1 && 2==2”)
    

objResult est True.

5
sinanguler

Script # compile C # en js et est l’enfant cérébral de l’équipe ASP.Net. Rick Strahl a également publié des articles sur l’intégration de js comme moteur d’exécution pour l’évaluation de l’expression.

4
David Robbins

Jetez un coup d'œil à Javascript .NET sur codeplex ( http://javascriptdotnet.codeplex.com/ ) avec la version 0.3.1, quelques nouvelles fonctionnalités intéressantes vous intéresseront probablement.

Découvrez un exemple de code:

// Initialize the context
JavascriptContext context = new JavascriptContext();

// Setting the externals parameters of the context
context.SetParameter("console", new SystemConsole());
context.SetParameter("message", "Hello World !");
context.SetParameter("number", 1);

// Running the script
context.Run("var i; for (i = 0; i < 5; i++) console.Print(message + ' (' + i + ')'); number += i;");

// Getting a parameter
Console.WriteLine("number: " + context.GetParameter("number"));
4
Deacon Frost

Je viens d'essayer RemObjects Script for .Net.

Cela fonctionne, même si je devais utiliser une fabrique statique (var a=A.createA();) à partir de JavaScript au lieu de la syntaxe var a=new A(). (La fonction ExposeType expose uniquement la statique!) Il n’ya pas beaucoup de documentation et le source est écrit avec Delphi Prism, ce qui est plutôt inhabituel pour moi et le réflecteur RedGate.

Donc: Facile à utiliser et à configurer, mais pas beaucoup d'aide pour les scénarios avancés.

Avoir aussi à installer quelque chose au lieu de simplement déposer les assemblées dans un répertoire est un inconvénient pour moi ...

4
sanosdole

IActiveScript est la méthode documentée par Microsoft pour ajouter une extensibilité de script à n’importe quoi. Vous pouvez utiliser IActiveScript depuis n'importe quelle application .NET pour appeler la logique de script. La logique peut faire la fête sur des objets .NET que vous avez placés dans le contexte de script. 

Cette réponse fournit une application qui le fait, avec le code: 

2
Cheeso

Il existe une implémentation de Script ActiveX Hôte moteur en C # disponible ici: analyser et exécuter JS par C #

Il permet d’utiliser Javascript (ou VBScript) directement à partir de C #, dans des processus natifs 32 bits ou 64 bits. La source complète contient environ 500 lignes de code C #. Il ne dépend que de manière implicite de la DLL du moteur JScript (ou VBScript) installée.

Par exemple, le code suivant:

Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3"));

affichera 1.66666666666667

2
Simon Mourier

Il y a aussi MsieJavaScriptEngine qui utilise le moteur Internet Explorers Chakra

2
Simon

Je sais que j'ouvre un vieux fil, mais j'ai beaucoup travaillé sur smnet (spidermonkey-dotnet). Dans les dernières années. Son objectif principal de développement a été l'intégration transparente d'objets .net dans le moteur spidermonkey. Il prend en charge une grande variété de conversions de valeurs js en objets .net. Certains d'entre eux, y compris les délégués et les événements.

Juste en disant qu'il pourrait être intéressant de vérifier maintenant qu'il y a un développement constant dessus:) . Je tiens le dépôt SVN à jour avec les corrections de bugs et les nouvelles fonctionnalités. Les fichiers de solution source et de projet sont configurés pour générer avec succès le téléchargement. S'il y a des problèmes d'utilisation, n'hésitez pas à ouvrir une discussion.

Je comprends le désir de disposer d’une solution javascript gérée, mais de tous les javascript gérés que j’ai utilisés, ils manquent tous de certaines fonctionnalités clés qui les rendent à la fois robustes et faciles à utiliser. J'attends moi-même qu'IronJS mûrit un peu. En attendant, je m'amuse à jouer avec spidermonkey-dotnet =) 

Projet spidermonkey-dotnet et page de téléchargement

Edit: créé la page wiki de documentation cet après-midi.

1
SilverX

Try ReoScript , un interpréteur JavaScript à code source ouvert implémenté en C #.

ReoScript permet à votre application d'exécuter JavaScript. Il a une grande variété de méthodes d’extension telles que SetVariable, Extension de fonction, utilisant le type CLR, la liaison d’événements .Net, etc. 

Bonjour le monde:

ScriptRunningMachine srm = new ScriptRunningMachine();
srm.Run(" alert('hello world!'); ");

Et voici un exemple de script qui crée un winform et le montre.

import System.Windows.Forms.*;        // import namespace

var f = new Form();                   // create form
f.click = function() { f.close(); };  // close when user clicked on form

f.show();                             // show 
1
Jing

Vous pouvez utiliser Rhino, un moteur Javascript de Mozilla écrit en Java, et l’utiliser avec IKVM. Voici quelques instructions.

Instructions: https://www.codeproject.com/Articles/41792/Embedding-JavaScript-into-C-with-Rhino-and-IKVM

0
luiseduardohd

je pense que tous les principaux moteurs JS opensource (JavaScriptCore, SpiderMonkey, V8 et KJS) fournissent des API d'intégration. Le seul que je connaisse directement est JavaScriptCore (nom du moteur JS dans lequel réside SquirrelFish), qui fournit une API C pure. Si la mémoire est utile (cela fait longtemps que je n’utilise pas .NET), .NET supporte assez bien la liaison dans les API C.

Honnêtement, je ne sais pas trop à quoi ressemble l'API pour les autres moteurs, mais je sais que tous les fournissent.

Cela dit, en fonction de vos objectifs, JScript.NET peut être préférable, car tous ces autres moteurs vous demanderont de les inclure dans votre application, JSC étant le seul à être livré avec un système d'exploitation, mais ce système d'exploitation est MacOS: D

0
olliej

V8.NET est un nouveau venu (à compter d'avril 2013) qui englobe plus étroitement les fonctionnalités du moteur V8 natif. Cela permet de mieux contrôler la mise en œuvre.

0
James Wilkins

Utilisez JSCRIPT.NET pour obtenir une bibliothèque (dll) du fichier js. Puis référence cette DLL dans votre application .NET et vous êtes juste là. TERMINÉ!

0
Nilav Ghosh