【问题标题】:Are there any .NET CLR/DLR implementations of ECMAScript?ECMAScript 是否有任何 .NET CLR/DLR 实现?
【发布时间】:2010-11-07 13:08:36
【问题描述】:

有谁知道真正的(即没有蒸汽软件)ECMAScript 针对.NET CLR/DLR 的实现?理想情况下类似于 Rhino 对 Java 的意义。在 .NET Framework / Mono Framework 上运行的可靠 Rhino 端口将是完美的。

我只见过少数提到的项目,但从未见过任何曝光或实际上我曾经能够运行脚本的任何项目。以下是我已经知道的:

  • MSScriptControl ActiveX Control:AFAIK,这是微软最后一个真正符合 ECMAScript 的实现(运行 JScript 5.7)。我已经与 MSScriptControl 集成,但不认为 COM 互操作是这个问题的答案。 x64 是这个选项的杀手锏。

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

  • Managed 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 互操作跳过箍来使用 MSScriptControl。 COM 的不一致性使得部署和确保一致执行变得非常困难。

我希望能够在 .NET 中执行相当复杂的 JavaScript 测试工具。这不是用于创建用户宏或简单的小脚本;我需要一个真正的 JavaScript 环境,比如 Rhino。如果实现在 CLR(而不是 COM)上运行,这将有助于解决当前的一些问题。

【问题讨论】:

  • 你能通过 ikvm 运行 rhino 吗? ikvm.net
  • JavaScript 在 Mozilla Rhino 上,通过 IKVM.NET 在 .NET 上。多棒的三明治:)
  • 或 Rhino over VMKit (llvm.org)。
  • Jint 现在确实可以处理柯里化和异常
  • 我的盗版实现正在进行中...

标签: .net javascript clr dynamic-language-runtime ecma262


【解决方案1】:

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

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

不幸的是,我不记得我是怎么找到它的。这是一个艰难的过程,我必须承认。我想我在某处找到了一些关于 Rhino(Java 代码)的参考 Mozilla 开发页面,这使我找到了 C# .NET 的实现。

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

自 2007 年以来,EcmaScript.NET 的原始 c# 代码就没有被修改过……至少在下载页面上是这样。

也许这会有所帮助??

HTH。

【讨论】:

  • 太好了,我很欣赏这些细节。如果它可以处理 YUI Compressor 的脚本,听起来它对我的东西也应该足够了。如果您不想将其作为您的主要目标,那么将其他人的帮助作为自己的项目可能会更容易。我非常乐意贡献我所做的任何修复/改进。谢谢!
  • 我当然不想拥有修改后的版本,所以我很高兴将它移入 codeplex,进入一个单独的项目..假设我拥有的代码库是..呃。 . 可以接受 :) (我也更喜欢 codeplex 而不是 google 代码 :P)
  • Google 代码 (code.google.com/p/ecmascript-net/) 上的 EcmaScript.NET 似乎在 2008 年 6 月移植了一些错误修复。如果您的更改是被所有者接受。
  • 这也是一个死项目吗?另外,我昨天发布了一个新版本的 YUICompressor.NET :)
  • 没有死,但没有被积极维护。所有者说他对补丁持开放态度,可能需要帮助移植 Rhino 错误修复。如果他把它打开得更广,你的修复可以进入他的回购,那就太好了,所以有一个单一的来源。然后你的 repos 可以专注于 YUI Compressor,其他人(我愿意)可以为 ECMAScript.NET 的维护做出贡献。
【解决方案2】:

还活着:

  • Jurassic(去年有一个提交。)
  • Jint(目前正在接受拉取请求。)

其他项目,大多已死:

疯狂的方法:

  • Rhino over IKVM(在 cmets 中提到过,但这里有一个链接可以了解更多信息。)

【讨论】:

  • IronJS +1。我一定会密切关注的。不过,这听起来还很早。有任何迹象表明它的效果如何?
【解决方案3】:

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

【讨论】:

  • 我以这个项目的形式向 Jurassic 添加了 ActiveXObject 支持:jurascript.codeplex.com,这样您就可以重用大多数旧的 WSH/JScript 脚本。显然,在假设这将毫无问题地工作之前,应该对它们进行彻底测试。 :)
  • Jurassic 是比较友好的框架之一,性能也不错
【解决方案4】:

没有人提到 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);
}

【讨论】:

    【解决方案5】:

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

    更新

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

    【讨论】:

    • 感谢@Sebastien 的建议。我想为 Javascript 创建一个像 Orchard.Scripting.Dlr 这样的脚本模块,这是我必须使用的库还是有一些所谓的对 DLR 更友好的东西?
    • 这是要使用的库,正确,但它已被弃用,取而代之的是 github 上的新库:github.com/sebastienros/jint
    【解决方案6】:

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

    干杯。

    【讨论】:

    • 您(或其他任何人)是否知道此实现有哪些注意事项?是纯管理的吗?或者它是否需要特定的处理器架构?我很好奇它是否会在 Mono 或其他 CLR 上运行。
    • 遗憾的是,您将无法在 Mono 上运行它,因为托管 C++ 无法在 Linux 上运行,因此它无法在 Mono 上运行。 Javascript .NET 在 x86 平台上运行,因为 v8 在 x86 上,遗憾的是您将无法在多线程应用程序中使用 Javascript .NET,因为 v8 不能很好地支持该功能。这就是我对这个项目的所有了解。我将它用于我的个人应用程序并且到目前为止运行良好。
    【解决方案7】:

    您可以使用 Jscript.net,它实际上可以处理任意 javascript 代码;你只需要通过jsc /fast- bar.js编译关闭“快速模式”

    我没有测试过这个;我只是在阅读this post 时注意到它,并认为这将是另一个合理的解决方案。 MSDN 有the docs for this optionwhat the limitations are if you don't use it

    【讨论】:

      【解决方案8】:

      V8.NET

      这可能是我见过的最好的。
      https://v8dotnet.codeplex.com/documentation

      此外,它从一开始就考虑到了 Mono 端口。 它使您可以从托管代码完全控制 V8 引擎的功能。

      【讨论】:

        【解决方案9】:

        我更喜欢 JINT 而不是 其他。

        JINT 可能很慢,但它很容易调试和与您自己的 .NET 类交互。 (jscript.dll等每次都设置[ComVisile]属性比较困难)。

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

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

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

        我必须重写整个课程。好难……

        【讨论】:

        • 这个帖子三年了,里面的信息可能已经过时了!
        • 是的。最终,从长远来看,我最终还是在 Java 中使用了 Rhino。
        • Rhino 1.7R 也有不错的表现。我也在使用它,直到 Oracle 发布带有新 Java 8 的“Nashorn”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多