将 JavaScript 引擎嵌入 .NET [已关闭]

Embedding JavaScript engine into .NET [closed]

提问人: 提问时间:10/6/2008 最后编辑:3 revs, 2 users 100%aprilchild 更新时间:3/7/2019 访问量:187071

问:


我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便用事实和引文来回答。

5年前关闭。

只是想知道是否有人曾经尝试过将任何 JS 引擎嵌入并实际集成到 .NET 环境中。我可以找到并实际使用(经过很多痛苦和努力,因为它已经过时且尚未完成)spidermonkey-dotnet 项目。有人在这方面有经验吗?像 SquirrelFish、V8 这样的引擎。

并不是说我对 Mozilla 的 Spidermonkey 不满意(将它用于类似 Rails 的迷你框架,用于核心 ASP.NET 应用程序中的自定义组件),但我仍然想进一步探索这些选项。命令行解决方案不是我需要的,我不能依赖 CLR 以外的任何东西,我需要从 JavaScript/C# 对象调用方法。

// c# class
public class A
{
    public string Hello(string msg)
    {
        return msg + " whatewer";
    }
}

// js snippet
var a = new A();
console.log(a.Hello('Call me')); // i have a console.log implemented, don't worry, it's not a client-side code :)

澄清一下 - 我并不是要在服务器端 javascript 中实际编程应用程序本身。它仅用于编写自定义用户子应用程序(可以看作是某种 DSL)。与 C# 相比,允许普通人使用 js 编程要容易得多(也更安全)。

C# JavaScript 蜘蛛猴

评论

0赞 Ahmed Yasin Koculu 11/14/2021
适用于 .NET github.com/koculu/topaz 的多线程 Javascript 引擎

答:

7赞 Jason Bunting 10/6/2008 #1

我想我仍然不清楚你要做什么,但 JScript.NET 可能值得研究,尽管托管 JScript 似乎更适合您的需求(它更像是 JavaScript 而不是 JScript.NET)。

就我个人而言,我认为以某种方式集成 V8 会很酷,但我并没有通过下载源代码;希望我有时间真正用它做点什么。

评论

0赞 aprilchild 10/6/2008
实际上,托管 JScript 是最接近我需求的东西。我知道它在Silverlight中,但不知道它已经发布。JScript.NET 不是一种选择。我真的不想让用户访问整个 .NET 堆栈。我只需要几个核心内置对象,它们可以用于他们的应用程序。
18赞 Alexander Abramov 11/25/2009
现在是 2009 年,托管 JScript 现在已经死了。
1赞 olliej 10/6/2008 #2

我相信所有主要的开源 JS 引擎(JavaScriptCore、SpiderMonkey、V8 和 KJS)都提供了嵌入 API。我唯一真正直接熟悉的是 JavaScriptCore(这是 SquirrelFish 所在的 JS 引擎的名称),它提供了一个纯 C API。如果内存可用(我已经有一段时间没有使用 .NET),.NET 对 C API 中的链接有相当好的支持。

老实说,我不确定其他引擎的 API 是什么样的,但我知道它们都提供了它们。

也就是说,根据您的目的,JScript.NET 可能是最好的,因为所有这些其他引擎都要求您将它们包含在您的应用程序中,因为 JSC 是唯一实际附带操作系统的引擎,但该操作系统是 MacOS :D

评论

2赞 aprilchild 10/6/2008
是的,所有主要引擎通常都是可嵌入的,但障碍实在太多了。学习嵌入指南,学习 C(++) API..我希望在集成方面已经做了一些工作。JScript.NET 不能使用,实际代码由互联网用户编写和执行。
5赞 Chris S 1/22/2009 #3

如果语言不是问题(任何沙盒脚本),那么 .NET 有 LUA。.NET Framework 的 Silverlight 版本也是沙盒式的 afaik。

0赞 Nilav Ghosh 3/7/2009 #4

使用 JSCRIPT.NET 获取 js 的库 (dll)。然后在您的 .NET 应用程序中引用此 dll,您就在那里。做!

92赞 Sébastien Ros - MSFT 10/26/2009 #5

开源 JavaScript 解释器 Jint (http://jint.codeplex.com) 完全符合您的需求。

编辑:
该项目已完全重写,现在托管在 Github 上,网址为 https://github.com/sebastienros/jint

评论

6赞 aprilchild 2/24/2010
建立在 DLR 之上的另一种可能性:用于 .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175 的 RemObjects 脚本
0赞 Andrew Savinykh 4/1/2010
我认为它是在 Delphi Prism / Oxygen 上编写的,并作为源代码提供,因此如果您尚未购买上述产品的许可证,它就没有那么有用了。我错了吗?如果任何地方都有二进制形式的版本,我想试一试。
2赞 marc hoffman 12/11/2011
RemObjects 脚本是用 Oxygene 编写的,没错,但你实际上并不需要 Oxygene 许可证来使用它 - 一方面,您可以从 remobjects.com/free 获取二进制安装程序,另一方面,如果您确实需要自己从源代码重建它,您甚至可以获得免费的 Oxygene 命令行编译器。.毕竟,NEt平台是语言独立性的。库是用什么语言编写的,你都可以使用它。
1赞 Roman Starkov 2/3/2014
最后一个版本在 2011...侏罗纪似乎更好。
3赞 Sébastien Ros - MSFT 3/3/2014
最后发布在 2014 实际上: github.com/sebastienros/jint
99赞 2 revs, 2 users 62%Michel Boissé #6

试试 Javascript .NET。它托管在 GitHub 上 它最初托管在 CodePlex 上,这里)

项目讨论:http://javascriptdotnet.codeplex.com/discussions

它实现了 Google V8。您可以使用它直接从 .NET 代码编译和运行 JavaScript,并提供 JavaScript 代码要使用的 CLI 对象。它从 JavaScript 生成本机代码。

评论

0赞 J.C. Inacio 6/7/2011
+1.这很简单,而且似乎效果很好。
6赞 Alan Macdonald 11/25/2011
有人声称这在项目的讨论板中已经死了,除了基本示例之外的文档很差,我正在努力在脚本中使用它向 .Net 事件添加 JavaScript 事件处理程序。
7赞 Oliver Bock 2/10/2012
Noesis(最初的开发公司)对这个项目失去了兴趣,但最终决定将控制权交给社区。因此,现在有一个新版本,其中包含许多错误修复。遗憾的是,尚不支持来自 .Net 的 JavaScript 回调。
0赞 Chris Pfohl 2/15/2014
未来的另一个注意事项:Nuget 包似乎以某种方式被无聊了......当您安装软件包时,它目前不会“正常工作”。
4赞 JB. 5/26/2014
由于javascriptdotnet已经死了,可以考虑改用ClearScript(见这个答案)
5赞 Deacon Frost #7

嘿,在 codeplex (http://javascriptdotnet.codeplex.com/) 上查看 Javascript .NET,版本 0.3.1 有一些非常可爱的新功能可能会让您感兴趣。

查看示例代码:

// Initialize the context
JavascriptContext context = new JavascriptContext();

// Setting the externals parameters of the context
context.SetParameter("console", new SystemConsole());
context.SetParameter("message", "Hello World !");
context.SetParameter("number", 1);

// Running the script
context.Run("var i; for (i = 0; i < 5; i++) console.Print(message + ' (' + i + ')'); number += i;");

// Getting a parameter
Console.WriteLine("number: " + context.GetParameter("number"));

评论

0赞 Joy George Kunjikkuru 11/23/2015
这是否适用于 .Net 对象。例如:如果我有一个 Employee 类,我可以将对象传递给 V8 并从 JavaScript 操作 Employee 对象吗?
8赞 Sergi Mansilla #8

您可以尝试 ironJS,尽管它正在大量开发中,但看起来很有前途。https://github.com/fholm/IronJS

评论

0赞 russbishop 4/27/2014
我们目前使用 IronJS,但现在它是一个死项目,编译器是用 F# 编写的,我可以使用它,但并不精通。
4赞 2 revs, 2 users 95%sanosdole #9

我刚刚尝试了 .Net 的 RemObjects 脚本

它有效,尽管我不得不使用 JavaScript 中的静态工厂 () 而不是语法。(ExposeType 函数仅公开静态信息! 没有太多的文档,源代码是用 Delphi Prism 编写的,这对我和 RedGate Reflector 来说是相当不寻常的。var a=A.createA();var a=new A()

因此:易于使用和设置,但对高级方案没有多大帮助。

还必须安装一些东西,而不仅仅是将程序集放在目录中,这对我来说是负面的......

1赞 3 revsSilverX #10

我知道我正在打开一个旧线程,但我在smnet(spidermonkey-dotnet)上做了很多工作。近年来。它的主要开发重点是将 .net 对象无缝嵌入到 spidermonkey 引擎中。它支持从 js 值到 .net 对象的各种转换。其中一些包括代表和活动。

只是说它可能值得检查一下,因为它:)有一些稳定的发展。 我确实通过错误修复和新功能使 SVN 存储库保持最新状态。源和项目解决方案文件配置为在下载时成功生成。如果在使用它时遇到任何问题,请随时打开讨论。

我确实理解拥有托管 javascript 解决方案的愿望,但在我使用过的所有托管 javascript 中,它们都非常缺乏一些关键功能,这些功能有助于使它们既健壮又易于使用。我自己正在等待 IronJS 成熟一点。在我等待的时候,我玩得很开心 spidermonkey-dotnet =)

SpiderMonkey-dotnet 项目和下载页面

编辑:今天下午创建了文档维基页面。

2赞 2 revsCheeso #11

Microsoft 记录的向任何内容添加脚本扩展性的方法是 IActiveScript。可以在 anyt .NET 应用中使用 IActiveScript 来调用脚本逻辑。该逻辑可以在已放入脚本上下文的 .NET 对象上进行分组。

这个答案提供了一个应用程序,它使用代码来做到这一点:

2赞 2 revsSimon Mourier #12

此处提供了 C# 中 ActiveX 脚本引擎主机的实现:通过 C# 解析和执行 JS

它允许在本机 32 位或 64 位进程中直接从 C# 使用 Javascript(或 VBScript)。完整源代码是 ~500 行 C# 代码。它仅对已安装的 JScript(或 VBScript)引擎 DLL 具有隐式依赖关系。

例如,以下代码:

Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3"));

将显示 1.666666666666667

41赞 2 revs, 2 users 50%bbqchickenrobot #13

任何刚刚收看的人都可以看看侏罗纪:

http://jurassic.codeplex.com/

编辑:这已经移到了GitHub上(乍一看似乎很活跃)

https://github.com/paulbartrum/jurassic

评论

3赞 atlaste 1/26/2013
这似乎是为数不多的既有原生 .NET 代码(而不是使用 f.ex. V8 引擎)又似乎仍然受支持(Ecmascript.net、jscript.net 和其他一堆似乎已经死了)的项目之一。+1 并感谢您的链接!
2赞 Roman Starkov 2/3/2014
在查看了这些答案中列出的每个项目后,我锁定了侏罗纪。它是仅有的两三个仍在积极维护的之一,它是真正的 JS,经过高度测试,并且是纯 .NET。
0赞 Jerome Haltom 1/15/2016
会添加我对侏罗纪的支持。它还能够序列化执行上下文的运行状态。这意味着你可以从字面上持久化你的 JavaScript 运行时、变量和所有内容。在某些情况下非常有用的功能。
1赞 Henning 5/26/2016
嗨,芥末,我找不到有关如何序列化执行上下文的运行状态的任何内容。你是怎么做到的?
-6赞 Ahmadali Shafiee #14

现在,使用 View 引擎可以实现。代码将是这样的:ASP.Net MVC4 Razor

// c# class
public class A
{
    public string Hello(string msg)
    {
        return msg + " whatewer";
    }
}

// js snippet
<script type="text/javascript">
var a = new A();
console.log('@a.Hello('Call me')'); // i have a console.log implemented, don't worry, it's not a client-side code :)
</script>

并且不仅适用于 MVC4 或其他 Web 应用程序,您可以在脱机桌面应用程序中使用它。Razor

1赞 Necowood #15

试试 ReoScript,一个用 C# 实现的开源 JavaScript 解释器。

ReoScript 使您的应用程序可以执行 JavaScript。它有各种各样的扩展方法,如SetVariable、Function Extension、using CLR Type、.Net Event Binding等。

世界您好:

ScriptRunningMachine srm = new ScriptRunningMachine();
srm.Run(" alert('hello world!'); ");

下面是一个创建 winform 并显示它的脚本示例。

import System.Windows.Forms.*;        // import namespace

var f = new Form();                   // create form
f.click = function() { f.close(); };  // close when user clicked on form

f.show();                             // show 
-1赞 2 revsJames Wilkins #16

V8.NET 是一个新孩子(截至 2013 年 4 月),它更紧密地包裹了原生 V8 引擎功能。它允许对实现进行更多控制。

评论

0赞 James Wilkins 9/8/2023
你需要检查你的眼睛,那不是说 VB,而是 V8。;)
0赞 bbqchickenrobot 9/27/2023
你是对的!太糟糕了,这是一个死项目......所以无论如何,这是一个有争议的问题;)
1赞 James Wilkins 9/27/2023
它没有死,这是我的项目,也许是睡觉,这些天我只是没有时间更新任何东西,但我可能很快就会到来。;)它仍然应该完全按预期工作,只是可能还没有最新的 V8 引擎更新。
62赞 3 revs, 2 users 92%JB. #17

您可能还对 Microsoft ClearScript 感兴趣,它托管在 GitHub 上并在 Ms-Pl 许可下发布。

我不是Microsoft粉丝,但我必须承认 V8 支持具有与 Javascript.Net 大致相同的功能,更重要的是,该项目仍在维护。就我而言,对委托的支持也比 Spidermonkey-dotnet 更好。

ps:它还支持 JScript 和 VBScript,但我们对这个旧东西不感兴趣。

ps:它与 .NET 4.0 和 4.5+ 兼容

评论

3赞 Peter 7/19/2013
+1 我完全不知道这个项目,看起来很有希望,希望它不会像大多数其他试图做同样事情的项目那样死去!
0赞 Brain2000 4/6/2017
在使用 Windows.JScript 引擎的 ClearScript 中,我发现有一点不同,那就是 .net 对象现在区分大小写,而旧的 ScriptControl 对象无关紧要。
0赞 TatiOverflow 12/28/2017
这是我对 ClearScript 的问题。运行时,它会抱怨缺少dll。然后,我被要求安装额外的Visual Studio组件。这没问题,只是我没有管理员权限,我将运行代码。如果它完全包含在 dll 中,那就太好了。
5赞 justin.m.chase #18

您可以在 C# 中使用 Chakra 引擎。以下是 msdn 上的一篇文章,展示了如何:

http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880

2赞 Simon #19

还有 MsieJavaScriptEngine,它使用 Internet Explorer 的脉轮引擎

6赞 2 revs, 2 users 81%sinanguler #20

我想出了一个更简单的解决方案。

我使用 Javascript 构建了一个文件,然后使用 VS2013 开发人员命令提示符中提供的 Javascript 编译器对其进行编译。.dll

一旦我们有了它,我们只需将其添加到文件夹中,然后在需要评估 Javascript 语句的项目中引用它。.dll\Support

创建详细步骤:.dll

  1. 在记事本中创建一个仅包含以下内容的文件:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
    
  2. 将文件另存为C:\MyEval.js

  3. 打开 VS2005 命令提示符(开始、程序、VS2005、VS2005 工具)

  4. 键入以访问Cd\C:\

  5. 类型

    jsc /t:library C:\MyEval.js
    
  6. 将创建一个名为 的新文件。MyEval.dll

  7. 复制到项目并引用它(也引用)。MyEval.dllMicrosoft.Jscript.dll

  8. 那么你应该可以这样称呼它:

    Dim jScriptEvaluator As New EvalClass
    Dim objResult As Object
    objResult = jScriptEvaluator.Evaluate(“1==1 && 2==2”)
    

objResult 的数据类型为 。True

0赞 luiseduardohd #21

您可以使用 Rhino 一个用 Java 编写的 Mozilla Javascript 引擎,并将其与 IKVM 一起使用,这里有一些说明

说明:https://www.codeproject.com/Articles/41792/Embedding-JavaScript-into-C-with-Rhino-and-IKVM