【问题标题】:Embedding JavaScript engine into .NET [closed]将 JavaScript 引擎嵌入 .NET [关闭]
【发布时间】:2010-09-15 10:10:48
【问题描述】:

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

并不是说我对 Mozilla 的 Spidermonkey 不满意(在核心 ASP.NET 应用程序中用于自定义组件的类似 Rails 的微型框架中使用它),但我仍然希望进一步探索这些选项。命令行解决方案不是我需要的,除了 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)。让普通人用 js 编程比 C# 更容易(也更安全)。

【问题讨论】:

标签: c# javascript spidermonkey


【解决方案1】:

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

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

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

【讨论】:

  • +1。这很简单,而且看起来效果很好。
  • 有人声称这在项目的讨论板上已经死了,除了基本示例之外的文档很差,我正在努力将 JavaScript 事件处理程序添加到脚本中的 .Net 事件中。
  • Noesis(原开发公司)对该项目失去了兴趣,但最终决定将控制权交给社区。因此,现在有一个包含许多错误修复的新版本。不幸的是,尚不支持来自 .Net 的 JavaScript 回调。
  • 未来的另一个注意事项:Nuget 包似乎以某种方式被破坏了......当您安装包时,它目前不能“正常工作”。
  • 由于 javascriptdotnet 已死,请考虑改用 ClearScript(参见answer
【解决方案2】:

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

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

【讨论】:

  • 建立在 DLR 之上的另一种可能性:用于 .NET 的 RemObjects 脚本 remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
  • 我认为它是在 Delphi Prism / Oxygen 上编写的,并作为源代码提供,因此如果您还没有购买上述产品的许可证,它就没有那么有用了。我错了吗?如果在任何地方都有二进制形式的版本,我想试一试。
  • RemObjects 脚本是用 Oxygene 编写的,没错,但您实际上并不需要 Oxygene 许可证来使用它 - 一方面,您可以从 remobjects.com/free 获得二进制安装程序,另一方面,您甚至可以获得免费的 Oxygene 命令行编译器,如果您确实需要从源代码自己重建它。毕竟,.NET 平台的一大好处是语言独立性。库是用什么语言编写的,你可以使用它并不重要。
  • 2011 年最后一次发布...侏罗纪似乎更好。
  • 实际上是 2014 年最后一次发布:github.com/sebastienros/jint
【解决方案3】:

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

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

ps:它也支持 JScript 和 VBScript,但我们对这些老东西不感兴趣。

ps:兼容 .NET 4.0 和 4.5+

【讨论】:

  • +1 我完全不知道这个项目,看起来很有希望,希望它不会像大多数其他试图做同样事情的项目一样死掉!
  • 我在使用 Windows.JScript 引擎的 ClearScript 中发现的一个不同之处是 .net 对象现在区分大小写,而旧的 ScriptControl 对象无关紧要。
  • 这是我的 ClearScript 问题。运行时它抱怨缺少 dll。然后我被要求安装额外的视觉工作室组件。这没问题,除非我没有管理员权限,我将在其中运行代码。如果它完全包含在 dll 中,那就太好了。
【解决方案4】:

任何人都只是调整检查侏罗纪以及:

http://jurassic.codeplex.com/

编辑:这已移至 github(乍一看似乎很活跃)

https://github.com/paulbartrum/jurassic

【讨论】:

  • 这似乎是为数不多的同时拥有本机 .NET 代码(而不是使用 f.ex. V8 引擎)并且似乎仍受支持的项目之一(Ecmascript.net、jscript.net还有一堆其他人似乎已经死了)。 +1 并感谢您的链接!
  • 在查看了这些答案中列出的每个项目之后,我已经将注意力集中在侏罗纪。它是目前仍在积极维护的仅有的两三个之一,它是真正的 JS,经过高度测试,并且是纯 .NET。
  • 会添加我对侏罗纪的支持。它还具有序列化执行上下文的运行状态的能力。这意味着您可以从字面上持久化您的 JavaScript 运行时、变量和所有内容。在某些情况下非常有用的功能。
  • 嗨芥末,我找不到任何关于如何序列化执行上下文的运行状态的信息。你是怎么做到的?
【解决方案5】:

您可以尝试 IronJS,虽然它正在大量开发中,但看起来很有希望。 https://github.com/fholm/IronJS

【讨论】:

  • 我们目前使用 IronJS,但现在它是一个死项目,编译器是用 F# 编写的,我可以使用它但并不精通。
【解决方案6】:

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

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

【讨论】:

  • 实际托管的 JScript 是最符合我需求的东西。我知道它在 Silverlight 中,但不知道它已发布。 JScript.NET 不是一个选项。我真的不想让用户访问整个 .NET 堆栈。我只需要几个可用于其应用程序的核心内置对象。
  • 现在是 2009 年,托管 JScript 现在已经死了。
【解决方案7】:

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

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

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

创建.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.dll复制到项目并引用它(也引用Microsoft.Jscript.dll)。

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

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

objResult 是True

【讨论】:

    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

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

      查看示例代码:

      // 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"));
      

      【讨论】:

      • 这是否适用于 .Net 对象。例如:如果我有一个 Employee 类,我可以将对象传递给 V8 并从 JavaScript 操作 Employee 对象吗?
      【解决方案10】:

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

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

      【讨论】:

        【解决方案11】:

        我刚试过RemObjects Script for .Net

        虽然我不得不使用 JavaScript 中的静态工厂 (var a=A.createA();) 而不是 var a=new A() 语法,但它可以工作。 (ExposeType 函数只公开静态数据!) 没有太多文档,而且源代码是用 Delphi Prism 编写的,这对我和 RedGate Reflector 来说是相当不寻常的。

        所以:易于使用和设置,但对高级场景帮助不大。

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

        【讨论】:

          【解决方案12】:

          Microsoft 为任何事物添加脚本可扩展性的文档化方法是 IActiveScript。您可以在任何 .NET 应用程序中使用 IActiveScript 来调用脚本逻辑。该逻辑可以与您放置在脚本上下文中的 .NET 对象相关联。

          这个答案提供了一个应用程序,代码:

          【讨论】:

            【解决方案13】:

            这里有一个 C# 中 ActiveX Scripting 引擎主机的实现:parse and execute JS by C#

            它允许在原生 32 位或 64 位进程中直接从 C# 使用 Javascript(或 VBScript)。完整的源代码是大约 500 行 C# 代码。它只对已安装的 JScript(或 VBScript)引擎 DLL 有隐式依赖。

            例如下面的代码:

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

            将显示 1.66666666666667

            【讨论】:

              【解决方案14】:

              还有MsieJavaScriptEngine使用Internet Explorers Chakra引擎

              【讨论】:

                【解决方案15】:

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

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

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

                【讨论】:

                • 是的,所有主要引擎一般都是可嵌入的,但是障碍太多了。学习嵌入指南,学习 C(++) API.. 我希望已经完成了一些集成工作。 JScript.NET 不能用,实际代码是互联网用户编写和执行的。
                【解决方案16】:

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

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

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

                spidermonkey-dotnet project and download page

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

                【讨论】:

                  【解决方案17】:

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

                  ReoScript 使您的应用程序可以执行 JavaScript。它有多种扩展方法,如SetVariable、Function Extension、使用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 
                  

                  【讨论】:

                    【解决方案18】:

                    使用 JSCRIPT.NET 获取 js 的库(dll)。然后在你的 .NET 应用程序中引用这个 dll,你就在那里。完成!

                    【讨论】:

                      【解决方案19】:

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

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

                      【讨论】:

                        【解决方案20】:

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

                        【讨论】:

                          【解决方案21】:

                          现在可以使用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>
                          

                          Razor 不仅适用于 MVC4 或其他 Web 应用程序,您还可以在离线桌面应用程序中使用它。

                          【讨论】:

                            猜你喜欢
                            • 2010-11-19
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-12-29
                            • 1970-01-01
                            • 2010-09-10
                            • 1970-01-01
                            • 2012-08-29
                            相关资源
                            最近更新 更多