有没有任何.NET CLR / DLR ECMAScript的实现?

有没有人知道ECMAScript的实现(我没有蒸发器)实施的.NET CLR / DLR ? 理想情况下,犀牛是Java的东西。 在.NET Framework / Mono Framework上运行的一个可靠的Rhino端口将是完美的。

我只看到了一些提到的项目,但从来没有见过任何亮相,或者实际上我曾经能够运行脚本的东西。 这就是我已经知道的:

  • MSScriptControl ActiveX控件 :AFAIK,这是微软最后一个真正符合ECMAScript标准的工具(运行JScr​​ipt 5.7)。 我已经与MSScriptControl集成,但不认为COM互操作是这个问题的答案。 x64是这个选项的杀手。

  • JScript.NET :我不计算JScript.NET,因为它永远不能成功parsing我的真实脚本。 它似乎有closures的麻烦。

  • 托pipeJScript :听起来像我想要的,但似乎是死在水中。 这是DLR的一个主要的示例实施,但是随后与SilverLight纠缠在一起,似乎自2007年以来已经成为优先事项。关于这一情况的可靠来源将是有帮助的。

  • MyJScript :构build为DLR的教程实现。 任何人都知道这是多么完整的实施?

  • Jint :.NET的JavaScript解释器。 目前还不支持柯里或tryfinally

  • .NET的RemObjects脚本 :一个有趣的竞争者仍在工作。 我对他们的市场营销感到困惑,因为这听起来可能最终是合适的。 如果有人知道更多,这也会有所帮助。

  • V8 for .NET :如果有人将V8移植到.NET,这将会很棒。 据我所知,在这方面也没有太大的努力。 链接是从一个托pipe的C ++包装器调用它的想法。

对于后台,我希望能够从.NET中执行JavaScript; 即将一组脚本加载到上下文中,并调用该上下文并检索执行结果。 目前我通过繁琐的COM Interop跳过使用MSScriptControl。 COM的不一致使得部署和确保一致的执行非常困难。

我希望能够从.NET内部执行相当复杂的JavaScripttesting工具。 这不是用于创build用户macros或简单的小脚本; 我需要一个像Rhino这样的真正的JavaScript环境。 如果实现在CLR(而不是COM)上运行,这对于当前的一些问题确实有帮助。

目前,我修改了我的YUICompressor.NET端口(项目)中的EcmaScript.NET版本。

如果你从这里获取源代码 ,我已经将修改后的代码包含在项目中,你可以参考。 这是我在.NET中发现的代码的唯一来源,它可以处理parsingJavaScript,服务器端。

不幸的是,我不记得我是如何终于find它的。 这是一个艰难的过程,我必须承认。 我想我find了一些关于Rhino(java代码)的引用Mozilla开发页面,这导致我发现C#.NET implimentation。

我不得不稍微修改它,以便YUI Compressor人员对其代码分支所做的一些更改同步。 所以修改的分支我可能不是最好的..但它是最接近我见过的原始Java分支。

EcmaScript.NET原来的c#代码自2007年以来一直没有被触及…至less在下载页面。

也许这可能有帮助?

HTH。

仍然大约活着:

  • 侏罗纪 (在去年有一个承诺)
  • Jint (目前正在接受请求)

其他项目,大部分已死:

  • IronJS :一个DLR托pipe的JS实现; IronJS谷歌集团 。 (最后一次提交是在2013年,最后一次是在2012年的博客更新 。)
  • 托pipeJScript :死在藤蔓上 。
  • MyJScript:在原文中提到,对于那些想要更多信息的人来说,有一篇文章: 在DLR上创build自己的语言 。
  • MonoJS :Mono有一个JScript.Net的实现,但是他们不再烦恼。

疯狂的方法:

  • 犀牛在IKVM (在评论中提到,但这是一个链接到更多的信息做这件事。)

没有人提到ClearScript,所以ClearScript 。

这不是一个执行; 它是一个支持V8,JScript和VBScript的互操作包装器,有一个非常好的API来从.NET代码中调用它们。

来自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); } 

你可以看看Jint( http://jint.codeplex.com ),它是一个开源的ECMAScript解释器。

更新

https://github.com/sebastienros/jint上的Github上提供了新的重写版本;

您应该在Codeplex上尝试Javascript .NET( http://javascriptdotnet.codeplex.com/ )。 他们用托pipe的C ++封装了v8,然后你可以在.NET应用中使用这个库,它就像一个魅力。 如果你问我,开放源代码提供了一些相当不错的function。

干杯。

您可以使用Jscript.net,它将实际上使用任意的JavaScript代码; 您只需要通过编译jsc /fast- bar.js来closures“快速模式”

我没有testing过这个; 我在阅读这篇文章的时候就注意到了,认为这将是另一个合理的解决scheme。 MSDN有这个选项的文档, 如果你不使用它的限制是什么 。

V8.NET

这可能是我遇到过的最好的一个了。
https://v8dotnet.codeplex.com/documentation

另外它从一开始就是以Mono端口为基础的。 它使您可以从托pipe代码完全控制V8引擎的function。

我更喜欢JINT而不是其他的。

JINT可能很慢,但很容易debugging和交互你自己的.NET类。 (每次为jscript.dll等设置[ComVisile]属性都很困难)。

在线程方面,JINT和侏罗纪工作正如我所料。 为了使用JScript引擎或Google V8,您必须注意UI线程问题。

但是,JINT在某些方面已经过时,因为我无法编译JQuery 1.5或更高版本。

我希望侏罗纪可以通过创build'AllowBob'sCLRClass=true'来消除它的限制来坚持自己的类。

我必须重写整个class级。 很难…