ECMAScript 是否有任何 .NET CLR/DLR 实现?
-
21-08-2019 - |
题
有谁知道 真实的 (我..没有蒸汽软件)ECMAScript 的实现 .NET CLR/DLR?理想情况下是这样的 Rhino 对于 Java 来说是什么. 。在 .NET Framework / Mono Framework 上运行的 Rhino 的可靠移植将是完美的。
我只看到了提到的少数项目,但从未见过任何项目被曝光,或者实际上任何我曾经能够运行脚本的项目。这是我已经知道的:
MSScriptControl ActiveX 控件:AFAIK,这是 Microsoft 最后一个真正的 ECMAScript 兼容实现(运行 JScript 5.7)。我已经与 MSScriptControl 集成,但不认为 COM 互操作是这个问题的答案。x64 是这个选项的杀手锏。
JScript.NET:我不计算 JScript.NET,因为它永远无法成功解析我的任何真实脚本。似乎在关闭方面遇到了麻烦。
托管 JScript:听起来像是我想要的,但它似乎死在水中了。它是 DLR 的一个主要示例实现,但后来与 SilverLight 纠缠在一起,并且自 2007 年以来似乎已经不再是优先事项。有关此状况的可靠来源会有所帮助。
MyJScript:构建为 DLR 的教程实现。有人知道这个实现有多完整吗?
金特:.NET 的 JavaScript 解释器。
目前还不支持 Currying 或try
-catch
-finally
..NET 的 RemObjects 脚本:一个有趣的竞争者仍在进行中。我对他们的营销方式感到困惑,不知道它到底是什么,但听起来它最终可能会合适。如果有人了解更多,那也会有帮助。
.NET 的 V8:如果有人将 V8 移植到 .NET,那就太好了。据我所知,在这方面也没有做出很大的努力。该链接指向从托管 C++ 包装器调用它的想法。
作为背景,我希望能够从 .NET 中执行 JavaScript;IE。将一组脚本加载到上下文中并调用该上下文并检索执行结果。目前,我通过繁琐的 COM Interop 来使用 MSScriptControl。COM 的不一致性使得部署和确保一致执行变得非常困难。
我希望能够从 .NET 中执行相当复杂的 JavaScript 测试工具。这不适用于创建用户宏或简单的小脚本;我需要一个像 Rhino 这样的真正的 JavaScript 环境。如果实现运行在 CLR(而不是 COM)之上,这确实有助于解决当前的一些问题。
解决方案
目前,我已经修改了一个版本 EcmaScript.NET 在我里面 YUI压缩机.NET 端口(项目)。
如果你抓住了 源代码来自这里, ,我已将修改后的代码包含在项目中,您可以参考。这是我在 .NET 中找到的唯一可以在服务器端处理解析 javascript 的代码源。
不幸的是,我不记得我最后是如何找到它的。我必须承认,这是一个艰难的过程。我想我在 Mozilla 开发页面上找到了一些关于 Rhino(java 代码)的参考资料,这让我找到了 C# .NET 实现。
我必须稍微修改它以与 YUI Compressor 人员对其代码分支所做的一些更改同步。所以我修改后的分支可能不是最好的..但它是我见过的最接近原始 Java 分支的。
自 2007 年以来,EcmaScript.NET 的原始 C# 代码就没有被触及过...至少对于下载页面来说是这样。
也许这可能有帮助?
HTH。
其他提示
还大致活着:
其他项目,大多已经死亡:
- 铁JS:DLR 托管的 JS 实现; IronJS 谷歌集团. 。(最后一次提交是在 2013 年,最后一次 博客更新 在2012年。)
- 托管 JScript:死了 在藤上.
- MyJScript:在原始帖子中提到,对于那些想要更多信息的人,有一篇文章: 在 DLR 之上创建您自己的语言.
- MonoJS:Mono 有 JScript.Net 的实现,但他们不再打扰了。
疯狂方法:
- Rhino 通过 IKVM (在评论中提到,但这里有一个链接,提供有关执行此操作的更多信息。)
没有人提到侏罗纪 http://jurassic.codeplex.com/我不知道它总体上有多好(性能、可用性等),但至少它可以解析相当复杂的脚本(其他实现则不能)并且它支持 ECMAScript 5 规范。我只是在这里添加链接以供参考。
没有人提到 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 解释器。
更新
新重写的版本可在 Github 上找到: https://github.com/sebastienros/jint
你应该尝试 Javascript .NET (http://javascriptdotnet.codeplex.com/)在 Codeplex 上。他们用托管 C++ 包装了 v8,然后您可以将这个库与 .NET 应用程序一起使用,它的工作方式就像一个魅力。如果你问我的话,开源提供了一些非常好的功能。
干杯。
您可以使用 Jscript.net,它实际上可以处理任意 javascript 代码;你只需要通过编译关闭“快速模式” jsc /fast- bar.js
我还没有测试过这个;我只是在读书时注意到的 这个帖子 并认为这将是另一个合理的解决方案。MSDN 有 此选项的文档 和 如果您不使用它会有什么限制.
V8.NET
这可能是我遇到过的最好的一个。
https://v8dotnet.codeplex.com/documentation
另外,它从一开始就考虑到了 Mono 端口。它使您可以通过托管代码完全控制 V8 引擎的功能。
我更喜欢 JINT 而不是 别人。
JINT 可能很慢,但很容易调试并与您自己的 .NET 类交互。(很难设定 [ComVisile]
每次 jscript.dll 等的属性)。
在线程方面,JINT 和 Jurassic 的工作符合我的预期。为了使用 JScript 引擎或 Google V8,您必须注意 UI 线程问题。
然而,JINT 在某些方面已经过时了,因为我在编译 JQuery 1.5 或更高版本时遇到了麻烦。
我希望侏罗纪可以通过创建来消除其限制,以坚持自己的类别进行工作 'AllowBob'sCLRClass=true'
.
我必须重写整个课程。很难...