38 votes

Existe-t-il des implémentations ECMAScript pour CLR / DLR .NET?

Quelqu'un sait-il de vrai (j'ai.. pas qu'une simple rumeur) implémentations de ECMAScript ciblage de l' .NET CLR/DLR? Idéalement, quelque chose comme ce que Rhino est de Java. Une solide port de Rhino en cours d'exécution sur .NET Framework / Cadre Mono, ce serait parfait.

J'ai seulement vu une poignée de projets mentionné, mais jamais vu tout venir à la lumière ou dans la réalité quelque chose que je n'ai jamais été en mesure d'exécuter le script sur. Voici ce que j'en sais déjà:

  • MSScriptControl Contrôle ActiveX: autant que je sache, ce Microsoft était l'un des derniers véritables conforme ECMAScript implementaiton (fonctionne JScript 5.7). J'ai intégré avec MSScriptControl mais ne considèrent pas la COM interop être une réponse à cette question. x64 est un tueur à gages pour cette option.

  • JScript.NET: je ne compte pas JScript.NET comme il n'a jamais pu réussir à analyser n'importe quel de mes véritables scripts. Il semble avoir du mal avec les fermetures.

  • Géré JScript: cela ressemble à ce que je veux, mais il semble être mort dans l'eau. Il était un grand exemple de mise en œuvre de la DLR, mais ensuite obtenu empêtré avec SilverLight et semble avoir disparu comme une priorité depuis 2007. Honorables de sources sur le statut de ce qui serait utile.

  • MyJScript: Construit comme un tutoriel de mise en œuvre de la DLR. Quelqu'un sait comment complet de la mise en œuvre c'est?

  • Jint: interpréteur JavaScript pour .NET. N'a pas encore de support de Nourrissage ou try-catch-finally.

  • RemObjects Script .NET: Un intéressant concurrent encore en travaux. Je suis confus par leur marketing de ce qu'il sera réellement, mais il sonne comme il pourrait éventuellement être un ajustement. Si quelqu'un en sait plus sur ce qui pourrait être utile aussi bien.

  • V8 pour .NET: Ce serait génial si quelqu'un portage de la V8 .NET. Pour autant que je sache, il n'existe pas un grand effort autour de ce soit. Le lien est pour une idée de l'appel à partir d'un wrapper C++ managé.

Pour le fond, je veux être en mesure d'exécuter le code JavaScript de l'intérieur .NET; c'est à dire charger un ensemble de scripts dans leur contexte et de les appeler dans un tel contexte, et de récupérer les résultats de l'exécution. Actuellement je saute à travers des cerceaux pour utiliser MSScriptControl par la lourdeur COM Interop. L'incohérence de la COM, il est vraiment difficile pour le déploiement et assurer l'uniformité de l'exécution.

Je aimerais être en mesure d'exécuter raisonnablement complexe JavaScript harnais de test de l'intérieur .NET. Ce n'est pas pour la création de l'utilisateur des macros ou simple minuscule scripts, j'ai besoin d'un vrai environnement JavaScript comme Rhino. Si la mise en œuvre était en cours d'exécution sur le dessus de la CLR (plutôt que de COM) ce serait vraiment aider avec certains des enjeux actuels.

17voto

Pure.Krome Points 28473

Actuellement, j'ai modifié une version de la EcmaScript.NET à l'intérieur de mon YUICompressor.NET port (projet).

Si vous prenez le code source à partir d'ici, j'ai joint mon code modifié dans le projet, vous pouvez référencer. C'est la seule source de code que j'ai trouvé .NET qui permet de traiter l'analyse javascript côté serveur.

Malheureusement, je ne me souviens pas comment je l'ai finalement trouvé. Il a été un processus difficile, je dois l'admettre. Je crois que j'ai trouvé quelques références Mozilla dev pages, quelque part sur la Rhino (le code java) qui m'a conduit à trouver que le C# .NET implimentation.

J'ai eu à le modifier légèrement à la synchronisation avec quelques modifications de l'YUI Compressor gars ont fait de leur code de la branche. Donc de la modification de la direction générale, j'ai peut-être pas le meilleur .. mais il est le plus proche que j'ai vu à l'origine de Java branche.

L'original du code c# pour EcmaScript.NET n'a pas été touché depuis 2007 ... au moins pour la page de téléchargements.

Peut-être cela peut vous aider??

HTH.

13voto

Sean McMillan Points 5096

Tout le monde semble être en se frappant la tête contre celui-ci:

D'Autres Projets, La Plupart Du Temps Mort:

Fou Méthode:

  • Rhino sur IKVM (Mentionné dans les commentaires, mais voici un lien pour plus d'informations à propos de le faire.)

12voto

AC. Points 220

Personne n'a mentionné jurassique http://jurassic.codeplex.com/ Je ne sais pas comment il est bon en général (performance, facilité d' utilisation, etc.) , mais au moins il des scripts assez complexes parse (autres implémentations non) et il prend en charge ECMAScript 5 spec. Je viens d'ajouter le lien ici pour référence.

8voto

Mark Rendle Points 4592

Personne n'a mentionné ClearScript, donc ClearScript .

Ce n'est pas une implémentation; c'est un wrapper d'interopérabilité qui supporte V8, JScript et VBScript, avec une très bonne API pour les appeler à partir de code .NET.

Exemple de code de la page CodePlex:

 using System;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;

// create a script engine
using (var engine = new V8ScriptEngine())
{
    // expose a host type
    engine.AddHostType("Console", typeof(Console));
    engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");

    // expose a host object
    engine.AddHostObject("random", new Random());
    engine.Execute("Console.WriteLine(random.NextDouble())");

    // expose entire assemblies
    engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));
    engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");

    // create a host object from script
    engine.Execute(@"
        birthday = new lib.System.DateTime(2007, 5, 22);
        Console.WriteLine(birthday.ToLongDateString());
    ");

    // use a generic class from script
    engine.Execute(@"
        Dictionary = lib.System.Collections.Generic.Dictionary;
        dict = new Dictionary(lib.System.String, lib.System.Int32);
        dict.Add('foo', 123);
    ");

    // call a host method with an output parameter
    engine.AddHostObject("host", new HostFunctions());
    engine.Execute(@"
        intVar = host.newVar(lib.System.Int32);
        found = dict.TryGetValue('foo', intVar.out);
        Console.WriteLine('{0} {1}', found, intVar);
    ");

    // create and populate a host array
    engine.Execute(@"
        numbers = host.newArr(lib.System.Int32, 20);
        for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; }
        Console.WriteLine(lib.System.String.Join(', ', numbers));
    ");

    // create a script delegate
    engine.Execute(@"
        Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean);
        oddFilter = new Filter(function(value) {
            return (value & 1) ? true : false;
        });
    ");

    // use LINQ from script
    engine.Execute(@"
        oddNumbers = numbers.Where(oddFilter);
        Console.WriteLine(lib.System.String.Join(', ', oddNumbers));
    ");

    // call a script function
    engine.Execute("function print(x) { Console.WriteLine(x); }");
    engine.Script.print(DateTime.Now.DayOfWeek);

    // examine a script object
    engine.Execute("person = { name: 'Fred', age: 5 }");
    Console.WriteLine(engine.Script.person.name);
}
 

7voto

Vous pouvez consulter Jint ( http://jint.codeplex.com ), un interpréteur ECMAScript à code source ouvert.

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