将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+兼容
任何人只要调查一下侏罗纪:
编辑:这已经转移到github(并乍一看似乎活跃)
你可以尝试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
详细步骤:
-
在记事本中创建一个只有这些内容的文件:
class EvalClass { function Evaluate(expression: String) { return eval(expression); } }
-
将该文件保存为
C:\MyEval.js
-
打开VS2005命令提示符(开始,程序,VS2005,VS2005工具)
-
键入
Cd\
到C:\
-
类型
jsc /t:library C:\MyEval.js
-
新建一个名为
MyEval.dll
文件。 -
将
MyEval.dll
复制到项目并引用它(也引用Microsoft.Jscript.dll
)。 -
那么你应该能够这样称呼它:
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应用程序,还可以在脱机桌面应用程序中使用它。