将JavaScript引擎嵌入到.NET中

只是想知道是否有人曾经尝试嵌入和实际上集成任何js引擎到.net环境中。 我可以找到和实际使用(经过很多痛苦和努力,因为它是相当过时,并没有完全)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#更容易(也更安全)。

尝试使用Javascript .NET 。 它在GitHub上托管它最初是在CodePlex上托管的, 在这里 )

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

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

开放源代码的JavaScript解释器Jint( http://jint.codeplex.com )正是你正在寻找的东西。

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

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

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

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

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

任何人只要调查一下侏罗纪:

http://jurassic.codeplex.com/

编辑:这已经转移到github(并乍一看似乎活跃)

https://github.com/paulbartrum/jurassic

你可以尝试ironJS,看起来很有希望,尽管它处于重大的发展。 https://github.com/fholm/IronJS

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

就个人而言,我觉得以某种方式整合V8会很酷,但是我没有通过下载源代码。 希望我有时间去做一些事情。

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

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

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

嘿看看在Codeplex的Javascript .NET( http://javascriptdotnet.codeplex.com/ )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")); 

Script#将C #编译为js,并且是ASP.Net团队之一的大脑孩子。 Rick Strahl也有一些嵌入js作为表达式评估的运行时引擎。

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

它工作,虽然我不得不使用静态工厂( var a=A.createA(); )而不是var a=new A()语法。 (ExposeType函数只显示静态文件!)没有太多的文档和源代码是用Delphi Prism编写的,这对我和RedGate反射器来说是非常不寻常的。

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

还必须安装的东西,而不是只是将程序集放在目录中对我来说是负面的…

微软将书面扩展性添加到任何东西的记载方式是IActiveScript。 您可以在任何.NET应用程序中使用IActiveScript来调用脚本逻辑。 逻辑可以派对你已经放入脚本上下文的.NET对象。

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

  • IE10 Chakra JScript引擎是否可以从C#独立访问?

在C#中有一个ActiveX脚本引擎主机的实现在这里可用: 解析并执行JS通过C#

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

例如,下面的代码:

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

将显示1.66666666666667

还有使用Internet Explorers Chakra引擎的MsieJavaScriptEngine

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

我使用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

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

只是说这可能是值得检查,现在有一些稳定的发展:)。 我确实保持SVN回购到最新的bug修复和新功能。 源代码和项目解决方案文件被配置为在下载时成功构建。 如果使用它有任何问题,请随时打开讨论。

我明白有一个托管的JavaScript解决方案的愿望,但所有托管的JavaScript的我已经使用他们都非常缺乏一些关键功能,使他们都健壮和易于使用。 我自己正在等待IronJS成熟一点。 当我等待,我玩spidermonkey-dotnet =)

spidermonkey-dotnet项目和下载页面

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

尝试使用C#实现的开源JavaScript解释器ReoScript 。

ReoScript使您的应用程序可以执行JavaScript。 它有各种各样的扩展方法,如SetVariable,Function Extension,使用CLR类型,.Net事件绑定等。

你好,世界:

 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 

我相信所有主要的开源JS引擎(JavaScriptCore,SpiderMonkey,V8和KJS)都提供了嵌入式API。 我实际上直接熟悉的唯一一个是JavaScriptCore(它是SquirrelFish所在的JS引擎的名称),它提供了一个纯粹的C API。 如果内存服务(这是自从我使用.NET一段时间以来).NET有相当不错的支持链接在C API的。

我真的不知道其他引擎的API是什么样的,但我知道他们都提供了。

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

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

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

您可以使用Rhino编写的Java引擎,并使用它与IKVM,下面是一些说明

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

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

 // 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应用程序,还可以在脱机桌面应用程序中使用它。