Question

Quelqu'un sait-il de real (i .. pas vaporware) implémentations de ECMAScript ciblant les .NET CLR / DLR ? Idéalement quelque chose comme ce que Rhino est pour Java . Un port solide de Rhino en cours d'exécution sur le .NET Framework / Mono Framework serait parfait.

Je ne l'ai vu une poignée de projets mentionnés, mais jamais vu venir à la lumière ou quoi que ce soit dans la réalité que j'ai jamais été en mesure d'exécuter le script sur. Voici ce que je sais déjà:

  • MSScriptControl ActiveX Control : Autant que je sache, ce fut la dernière véritable implementaiton compatible ECMAScript de Microsoft (court JScript 5.7). Je l'ai intégré à MSScriptControl mais ne considère pas COM Interop être une réponse à cette question. x64 est un tueur pour cette option.

  • JScript.NET : Je ne compte pas JScript.NET car il n'a jamais pu analyser avec succès l'un de mes vrais scripts. Il semble avoir du mal avec les fermetures.

  • Managed JScript : On dirait ce que je veux, mais il semble être mort dans l'eau. Ce fut une mise en œuvre d'exemple majeur pour le DLR mais empêtré avec SilverLight et semble avoir disparu comme une priorité depuis 2007. sources sur l'état admissibles aux cela serait utile.

  • MyJScript : Construit comme une implémentation de tutoriel pour le DLR . Quelqu'un sait comment complet d'une mise en œuvre est ce?

  • Jint : interpréteur JavaScript pour .NET. Ne pas encore de soutien Currying ou try - catch -. finally

  • RemObjects Script pour .NET : Un candidat intéressant encore dans les œuvres. Je suis confus par leur marketing à ce qu'il sera effectivement, mais il semble que cela pourrait éventuellement être un ajustement. Si quelqu'un en sait plus à ce sujet qui serait utile aussi bien.

  • V8 pour .NET : Ce serait génial si quelqu'un V8 à .NET porté. Pour autant que je sais qu'il n'y a pas un grand effort autour de ce soit. Le lien est une idée d'appeler en elle d'une enveloppe C ++ géré.

Pour le fond, je veux être en mesure d'exécuter JavaScript à partir de .NET; à savoir charger un ensemble de scripts en contexte et remettre en ce contexte et récupérer les résultats d'exécution. Actuellement, je saute à travers des cerceaux à utiliser MSScriptControl via COM Interop lourd. L'incohérence de COM rend vraiment difficile pour le déploiement et d'assurer une exécution cohérente.

Je voudrais être en mesure d'exécuter des harnais de test JavaScript raisonnablement complexes à partir de .NET. Ce n'est pas pour créer des macros utilisateur ou des scripts simples minuscules; Je besoin d'un véritable environnement JavaScript comme Rhino. Si la mise en œuvre a été en cours d'exécution sur le dessus du CLR (plutôt que COM) ce serait vraiment aider avec certains des problèmes actuels.

Autres conseils

Encore peu près vivant:

Autres projets, La plupart du temps mort:

  • IronJS : Une mise en œuvre JS hébergé DLR; IronJS Groupe Google . (Validation dernière a été en 2013, dernière mise à jour en 2012).
  • Managed JScript : sur la vigne.
  • MyJScript: Mentionné dans le message original, pour ceux qui veulent plus d'information, il y a un article: MonoJS . Mono a une implémentation de JScript.Net, mais ils abandonnent la peine

Crazy Méthode:

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

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 scripts parse relativement complexes (autres implémentations ne le font pas) et il prend en charge les spécifications ECMAScript 5. Je viens d'ajouter le lien ici pour référence.

Personne ne dit ClearScript, donc ClearScript .

Il est pas une mise en œuvre; il est une enveloppe Interop qui prend en charge V8, JScript et VBScript, avec une API vraiment agréable d'appeler en eux à partir du 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);
}

Vous pouvez jeter un oeil à Jint ( http://jint.codeplex.com ) qui est un interprète ECMAScript open source.

Mise à jour

Nouveaux réécrite version disponible sur Github https://github.com/sebastienros/jint

Vous devriez essayer Javascript .NET ( http://javascriptdotnet.codeplex.com/ ) sur CodePlex. Ils enveloppées v8 avec C ++ géré et vous pouvez utiliser cette bibliothèque avec une application .NET et il fonctionne comme un charme. L'open source offre quelques très bonnes caractéristiques si vous me demandez.

Vive.

Vous pouvez utiliser Jscript.net et il fait travailler avec le code javascript arbitraire; Vous avez juste besoin de désactiver « mode rapide » en compilant avec jsc /fast- bar.js

Je n'ai pas testé; Je viens remarqué en lisant ce poste et figuré serait une autre solution raisonnable. MSDN A la documentation pour cette option et quelles sont les limites si vous ne l'utilisez pas .

V8.NET

Celui-ci est probablement le meilleur que je suis venu à travers
https:. //V8dotnet.codeplex .com / documentation

De plus, sa été construit depuis le début avec un port Mono à l'esprit. Il vous donne un contrôle total sur la puissance du moteur V8 de code managé.

Je préfère plutôt JINT que la autres.

JINT peut être lent, mais il est facile de débogage et d'interagir vos propres classes .NET. (Il est difficile de définir les attributs à chaque fois [ComVisile] pour jscript.dll etc).

En termes de filetage, JINT et travail Jurassic comme je m'y attendais. Pour travailler avec le moteur JScript ou Google V8, vous devez prêter attention à problème de l'interface utilisateur-threading.

Cependant, JINT est hors du dans certains aspects, parce que j'ai du mal à compiler JQuery 1.5 ou version ultérieure.

J'espère que Jurassic peut retirer sa limite de coller sa propre classe pour travailler avec en créant 'AllowBob'sCLRClass=true'.

Je dois réécrire toute la classe. Il est difficile ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top