Y at-il des implémentations CLR .NET / DLR de ECMAScript?
-
21-08-2019 - |
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 outry
-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.
La solution
À l'heure actuelle, j'ai modifié une version du EcmaScript.NET dans ma YUICompressor.NET orifice (projet).
Si vous prenez le code source , j'ai inclus mon code modifié dans le projet, que vous pouvez faire référence. Ceci est la seule source de code que j'ai trouvé dans .NET qui peut gérer javascript l'analyse syntaxique, côté serveur.
Malheureusement, je ne me souviens pas comment je l'ai enfin trouvé. Ce fut un processus difficile, je dois admettre. Je pense que je l'ai trouvé quelques références pages dev Mozilla Rhino quelque part (le code java) qui m'a amené à constater que C # .NET implimentation.
Je devais modifier slighty synchroniser avec quelques modifications les gars YUI Compressor ont fait à leur branche de code. Ainsi, la branche modifiée je pourrait ne pas être le meilleur .. mais il est le plus proche que je l'ai vu à la branche Java d'origine.
L'original c # code pour EcmaScript.NET n'a pas été touché depuis 2007 ... au moins pour la page de téléchargement.
cela pourrait peut-être aider ??
HTH.
Autres conseils
Encore peu près vivant:
- Jurassic (avait un commit dans l'année dernière.)
- Jint (prenant actuellement des demandes de traction.)
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 ...