是否有ECMAScript的.NET CLR/DLR实现?

mck*_*mey 38 .net javascript clr dynamic-language-runtime ecma262

有没有人知道针对.NET CLR/DLR的ECMAScript 的真实(i ..无蒸发器)实现?理想情况下,Rhino适用于Java.在.NET Framework/Mono Framework上运行的可靠Rhino端口将是完美的.

我只看过一些提到过的项目,但从来没有看到过任何我能够运行脚本的东西.这是我已经知道的:

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

  • JScript.NET:我不算JScript.NET,因为它永远无法成功解析我的任何真实脚本.闭包似乎有问题.

  • 管理JScript:听起来像我想要的但它似乎死在水中.这是DLR的一个主要示例实现,但后来与SilverLight纠缠在一起,并且自2007年以来似乎已经逐渐消失.有关此状态的可信来源将是有帮助的.

  • MyJScript:作为DLR的教程实现而构建.有人知道这是一个完整的实现吗?

  • Jint:.NET的JavaScript解释器.不支持Currying或try- catch- finally.

  • RemObjects Script for .NET:一个有趣的竞争者仍在开发中.我对他们的营销实际上是什么感到困惑,但听起来它最终可能是合适的.如果有人知道更多有关它也会有所帮助.

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

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

我希望能够从.NET中执行相当复杂的JavaScript测试工具.这不是用于创建用户宏或简单的小脚本; 我需要像Rhino这样的真实JavaScript环境.如果实现是在CLR(而不是COM)之上运行的,那么这对当前的一些问题确实有帮助.

Pur*_*ome 17

目前,我已经修改了一个版本的EcmaScript.NET我里面YUICompressor.NET端口(项目).

如果您从这里获取源代码,我已将修改后的代码包含在项目中,您可以参考该代码.这是我在.NET中找到的唯一代码来源,它可以处理解析javascript,服务器端.

不幸的是,我不记得我是如何找到它的.我必须承认,这是一个艰难的过程.我想我找到了一些关于Rhino(java代码)的Mozilla dev页面的引用,这让我发现了C#.NET的实现.

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

自2007年以来,尚未触及EcmaScript.NET的原始c#代码...至少对于下载页面而言.

也许这可能有帮助?

HTH.


Sea*_*lan 13

仍大致活着:

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

其他项目,主要是死亡:

疯狂方法:

  • IKVM上的Rhino(在评论中提到,但这里有关于执行此操作的更多信息的链接.)


AC.*_*AC. 12

没有人提到过jurassic http://jurassic.codeplex.com/ 我不知道它有多好(性能,可用性等),但至少它解析相当复杂的脚本(其他实现没有)并且它支持ECMAScript 5规范.我只是在这里添加链接以供参考.


Mar*_*dle 8

没人提到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);
}
Run Code Online (Sandbox Code Playgroud)


Séb*_*SFT 7

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

更新

在Github上可以通过https://github.com/sebastienros/jint获得最新的重写版本


Dea*_*ost 6

您应该在Codeplex上尝试Javascript .NET(http://javascriptdotnet.codeplex.com/).他们使用托管C++包装v8,然后你可以将这个库与.NET应用程序一起使用,它就像魅力一样.如果你问我,开源提供了一些非常好的功能.

干杯.