.net - ecmascript - tc39




是否有ECMAScript的.NET CLR/DLR實現? (6)

有沒有人知道針對.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)之上運行的,那麼這對當前的一些問題確實有幫助。


V8.NET

這個可能是我遇到過的最好的一個。
https://v8dotnet.codeplex.com/documentation

此外,它的設計從一開始就考慮到了Mono端口。 它使您可以從託管代碼完全控制V8引擎的功能。


仍大致活著:

  • Jurassic (去年有承諾。)
  • Jint (目前正在接受拉動請求。)

其他項目,主要是死亡:

瘋狂方法:

  • IKVM上的Rhino (在評論中提到,但這裡有關於執行此操作的更多信息的鏈接。)

您可以查看Jint( Jint ),它是一個開源的ECMAScript解釋器。

更新

在Github上可以通過Jint獲得最新的重寫版本


您應該在Codeplex上嘗試Javascript .NET( http://javascriptdotnet.codeplex.com/ )。 他們使用託管C ++包裝v8,然後你可以將這個庫與.NET應用程序一起使用,它就像魅力一樣。 如果你問我,開源提供了一些非常好的功能。

乾杯。


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

沒人提到jurassic Jurassic我不知道它有多好(性能,可用性等),但至少它解析相當複雜的腳本(其他實現沒有),它支持ECMAScript 5規範。 我只是在這裡添加鏈接以供參考。





ecma262