Intégration du moteur JavaScript dans .NET [fermé]


217

Je me demande simplement si quelqu'un a déjà essayé d'incorporer et d'intégrer un moteur js dans l'environnement .net. Je pourrais trouver et réellement utiliser (après BEAUCOUP de douleur et d'efforts, car il est assez obsolète et pas tout à fait terminé) le projet spidermonkey-dotnet. Quelqu'un ayant de l'expérience dans ce domaine? Des moteurs comme SquirrelFish, V8 ..

Non pas que je ne sois pas satisfait du Spidermonkey de Mozilla (en l'utilisant pour un mini-cadre semblable à Rails pour des composants personnalisés à l'intérieur de l'application ASP.NET de base), mais j'aimerais quand même explorer un peu plus loin les options. Les solutions en ligne de commande ne sont pas ce dont j'ai besoin, je ne peux pas compter sur autre chose que CLR, j'ai besoin d'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'essaie pas de programmer l'application elle - même en javascript côté serveur. Il est utilisé uniquement pour écrire des 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 la programmation de personnes normales en js qu'en C #.

Réponses:


98

Essayez Javascript .NET . Il est hébergé sur GitHub Il était à l'origine hébergé sur CodePlex, ici )

Discussions sur le projet: http://javascriptdotnet.codeplex.com/discussions

Il implémente Google V8. Vous pouvez compiler et exécuter JavaScript directement à partir du code .NET avec lui, et fournir également des objets CLI à utiliser par le code JavaScript. Il génère du code natif à partir de JavaScript.


+1. C'est simple et semble très bien fonctionner.
JC Inacio

6
Il y a des affirmations que cela est mort dans les forums de discussion du projet, la documentation au-delà d'un exemple de base est pauvre et j'ai du mal à ajouter un gestionnaire d'événements JavaScript à un événement .Net avec lui dans un script.
Alan Macdonald

6
Noesis (entreprise en développement d'origine) a perdu tout intérêt pour le projet, mais a finalement décidé de donner le contrôle à la communauté. Par conséquent, il y a maintenant une nouvelle version qui inclut de nombreuses corrections de bugs. Malheureusement, les rappels JavaScript depuis .Net ne sont pas encore pris en charge.
Oliver Bock

Une autre note pour l'avenir: il semble que le package Nuget soit en quelque sorte falsifié ... il ne fonctionne pas actuellement "uniquement" lorsque vous installez le package.
Chris Pfohl

3
Étant donné que javascriptdotnet est mort, envisagez d'utiliser ClearScript à la place (voir cette réponse )
JB. Avec Monica.

86

L'interpréteur JavaScript open source Jint ( http://jint.codeplex.com ) fait exactement ce que vous recherchez.

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


6
Une autre possibilité basée sur DLR: RemObjects Script for .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
aprilchild

Je pense que c'est écrit sur Delphi Prism / Oxygen, et fourni comme code source, donc si vous n'avez pas acheté de licence pour les produits susmentionnés, ce n'est pas très utile. Ai-je tort? S'il y a une version sous forme binaire n'importe où, j'aimerais l'essayer.
Andrew Savinykh

2
RemObjects Script est écrit en Oxygène, correct, mais vous n'avez pas réellement besoin d'une licence Oxygene pour l'utiliser - pour l'un, vous pouvez obtenir le programme d'installation binaire sur remobjects.com/free , pour un autre, vous pouvez même obtenir le compilateur de ligne de commande Oxygene gratuit si vous aviez besoin de le reconstruire vous-même, à partir de la source. Après tout, l'un des grands avantages de la plate-forme .NEt est l'indépendance linguistique. peu importe la langue dans laquelle une bibliothèque est écrite, pour que vous puissiez l'utiliser.
marc hoffman

1
Dernière sortie en 2011 ... Jurassic semble mieux.
Roman Starkov

3
Dernière sortie en 2014 en fait: github.com/sebastienros/jint
Sébastien Ros - MSFT

54

Vous pourriez également être intéressé par Microsoft ClearScript qui est hébergé sur GitHub et publié sous la licence Ms-Pl.

Je ne suis pas fanboy de Microsoft, mais je dois admettre que le support 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, le soutien aux délégués fonctionne également mieux qu'avec Spidermonkey-dotnet.

ps: Il supporte également JScript et VBScript mais nous n'étions pas intéressés par ce vieux truc.

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


3
+1 Je n'étais pas du tout au courant de ce projet, il semble prometteur, espérons qu'il ne mourra pas comme la plupart des autres projets essayant de faire la même chose!
Peter

Une chose que j'ai trouvée différente dans ClearScript en utilisant le moteur Windows.JScript est que les objets .net sont désormais sensibles à la casse, où l'ancien objet ScriptControl n'avait plus d'importance.
Brain2000

Voici mon problème avec ClearScript. Lors de l'exécution, il se plaint qu'il manque des DLL. Ensuite, on me demande d'installer des composants Visual Studio supplémentaires. Ce n'est pas un problème, sauf que je n'aurai aucun privilège d'administrateur pour exécuter le code. Ce serait bien s'il était totalement autonome dans une DLL.
TatiOverflow

38

Quiconque se connecte également à Jurassic:

http://jurassic.codeplex.com/

edit: cela a migré vers github (et semble actif à première vue)

https://github.com/paulbartrum/jurassic


3
Il semble que ce soit l'un des rares projets à avoir à la fois du code .NET natif (au lieu d'utiliser f.ex. le moteur V8) et semble toujours être pris en charge (Ecmascript.net, jscript.net et un tas d'autres semblent être morte). +1 et merci pour le lien!
atlaste

2
Après avoir vérifié tous les projets répertoriés dans ces réponses, je me suis tourné vers Jurassic. C'est l'un des deux ou trois seuls qui sont encore activement maintenus, c'est du vrai JS, hautement testé et c'est du pur .NET.
Roman Starkov

Ajouterait mon soutien à Jurassic. Il a également la possibilité de sérialiser l'état d'exécution du contexte d'exécution. Cela signifie que vous pouvez littéralement conserver votre runtime JavaScript, vos variables et tout. Fonctionnalité extrêmement utile dans certains cas.
Jerome Haltom

Salut wasabi, je n'ai rien trouvé sur la façon de sérialiser l'état d'exécution du contexte d'exécution. Comment avez-vous réussi cela?
Henning


7

Je suppose que je ne suis toujours pas clair sur ce que vous essayez de faire, mais JScript.NET pourrait valoir la peine d'être examiné, bien que JScript géré semble être plus approprié à vos besoins (il ressemble plus à JavaScript qu'à JScript.NET) .

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


en fait, JScript géré est la chose la plus proche de mes besoins. Je savais que c'était dans Silverlight, je ne savais pas qu'il était sorti. JScript.NET n'est pas une option. Je ne veux vraiment pas donner aux utilisateurs l'accès à toute la pile .NET. J'ai juste besoin de quelques objets intégrés de base qu'ils peuvent utiliser pour leurs applications.
avrilchild

17
Nous sommes en 2009 et Managed JScript est mort maintenant.
Alexander Abramov

5

Si la langue n'est pas un problème (n'importe quel script en bac à sable), il y a LUA pour .NET . La version Silverlight du framework .NET est également en bac à sable.


5

Hé, jetez un œil à Javascript .NET sur codeplex ( http://javascriptdotnet.codeplex.com/ ) avec la version 0.3.1, il y a de nouvelles fonctionnalités assez douces qui pourraient vous intéresser.

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"));

Est-ce que cela fonctionne pour les objets .Net. Par exemple: si j'ai une classe Employee, puis-je passer l'objet à V8 et manipuler l'objet Employee à partir de JavaScript?
Joy George Kunjikkuru


5

J'ai plutôt proposé une solution beaucoup plus simple.

J'ai construit un .dllfichier en utilisant Javascript, puis je l'ai compilé en utilisant le compilateur Javascript qui est disponible dans une invite de commande développeur VS2013.

Une fois que nous avons le, .dllnous l'ajoutons simplement au \Supportdossier, puis nous l' avons référencé 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 ces contenus:

    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, VS2005, VS2005 Tools)

  4. Tapez Cd\pour accéder àC:\

  5. Type

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

  7. Copiez MyEval.dlldans le projet et référencez-le (référence également 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.


4

Je viens d'essayer le script RemObjects pour .Net .

Cela fonctionne, même si j'ai dû utiliser une usine statique ( var a=A.createA();) de JavaScript au lieu de la var a=new A()syntaxe. (La fonction ExposeType expose uniquement la statique!) Pas beaucoup de documentation et la source est écrite 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.

Le fait d'avoir à installer quelque chose au lieu de simplement déposer les assemblys dans un répertoire est un inconvénient pour moi ...


2

La méthode documentée de Microsoft pour ajouter une extensibilité de script à n'importe quoi est IActiveScript. Vous pouvez utiliser IActiveScript à partir de l'application anyt .NET pour appeler la logique de script. La logique peut faire partie des objets .NET que vous avez placés dans le contexte de script.

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


2

Il existe une implémentation d'un hôte de moteur de script ActiveX 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 est d'environ 500 lignes de code C #. Il a uniquement une dépendance implicite sur la DLL du moteur JScript (ou VBScript) installé.

Par exemple, le code suivant:

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

affichera 1.66666666666667



1

Je crois que tous les principaux moteurs JS open source (JavaScriptCore, SpiderMonkey, V8 et KJS) fournissent des API d'intégration. Le seul que je connaisse directement est JavaScriptCore (qui est le nom du moteur JS dans lequel SquirrelFish vit) qui fournit une pure API C. Si la mémoire est bonne (cela fait un moment que je n'ai pas utilisé .NET) .NET a un assez bon support pour la liaison dans les API C.

Honnêtement, je ne sais pas trop à quoi ressemblent les API des autres moteurs, mais je sais qu'ils les fournissent tous.

Cela dit, selon vos objectifs, JScript.NET peut être le meilleur, car tous ces autres moteurs vous obligeront à les inclure dans votre application, car JSC est le seul qui est réellement livré avec un système d'exploitation, mais ce système d'exploitation est MacOS: D


2
oui, tous les principaux moteurs sont généralement intégrables, mais il y a tout simplement trop d'obstacles. étudier le guide d'intégration, apprendre l'API C (++) .. j'espérais qu'il y aurait déjà du travail sur l'intégration. JScript.NET ne peut pas être utilisé, le code réel est écrit et exécuté par les internautes.
April April

1

Je sais que j'ouvre un vieux fil mais j'ai fait beaucoup de travail 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 des valeurs js en objets .net. Certains d'entre eux, y compris les délégués et les événements.

Il suffit de dire qu'il vaut peut-être la peine de vérifier maintenant qu'il y a un développement constant :). Je garde le repo SVN à jour avec des corrections de bugs et de 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. En cas de problème d'utilisation, n'hésitez pas à ouvrir une discussion.

Je comprends le désir d'avoir 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 IronJS pour mûrir un peu. Pendant que j'attends, je m'amuse à jouer avec spidermonkey-dotnet =)

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

Edit: création d'une page wiki de documentation cet après-midi.


1

Essayez ReoScript , un interpréteur JavaScript open source implémenté en C #.

ReoScript permet à votre application d'exécuter JavaScript. Il a une grande variété de méthons d'extension tels que SetVariable, Extension de fonction, en 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 l'affiche.

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 

0

Utilisez JSCRIPT.NET pour obtenir une bibliothèque (dll) des js. Référencez ensuite cette DLL dans votre application .NET et vous y êtes. TERMINÉ!



0

V8.NET est un nouveau venu sur le bloc (en avril 2013) qui enveloppe plus étroitement la fonctionnalité native du moteur V8. Il permet un meilleur contrôle de la mise en œuvre.


-5

C'est possible maintenant avec ASP.Net MVC4 RazorView Engine. le code sera le suivant:

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

// js snippet
<script type="text/javascript">
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 :)
</script>

et Razorn'est pas seulement pour MVC4 ou d'autres applications Web et vous pouvez l'utiliser dans des applications de bureau hors ligne.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.