将JavaScript引擎嵌入到.NET中

时间:2008-10-05 22:15:44

标签: c# javascript spidermonkey

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

并不是说我对Mozilla的Spidermonkey不满意(将它用于核心ASP.NET应用程序中的自定义组件的Rails类miniframework),但我仍然希望能够进一步探索这些选项。命令行解决方案不是我需要的,我不能依赖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#更容易(也更安全)。

22 个答案:

答案 0 :(得分:94)

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

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

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

答案 1 :(得分:81)

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

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

上托管在Github上

答案 2 :(得分:49)

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

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

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

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

答案 3 :(得分:37)

任何人都只是在调查侏罗纪:

http://jurassic.codeplex.com/

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

https://github.com/paulbartrum/jurassic

答案 4 :(得分:8)

你可以试试ironJS,看起来很有前途,虽然它正处于重大发展阶段。 https://github.com/fholm/IronJS

答案 5 :(得分:7)

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

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

答案 6 :(得分:5)

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

我使用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”)
    
  9. objResult是True

答案 7 :(得分:5)

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

答案 8 :(得分:5)

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

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

答案 9 :(得分:4)

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

答案 10 :(得分:4)

嘿,看看版本为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"));

答案 11 :(得分:4)

我刚试过 RemObjects Script for .Net

虽然我不得不使用JavaScript中的静态工厂(var a=A.createA();)而不是var a=new A()语法,但它确实有效。 (ExposeType函数只暴露静态!) 没有太多的文档和源代码是用Delphi Prism编写的,这对我和RedGate Reflector来说很不寻常。

所以:易于使用和设置,但对高级方案没什么帮助。

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

答案 12 :(得分:2)

Microsoft将脚本可扩展性添加到任何内容的文档记录方式是IActiveScript。您可以在任何.NET应用程序中使用IActiveScript来调用脚本逻辑。逻辑可以在您放入脚本上下文的.NET对象上聚会。

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

答案 13 :(得分:2)

还有MsieJavaScriptEngine使用Internet Explorers Chakra引擎

答案 14 :(得分:2)

C#中有ActiveX Scripting引擎主机的实现可在此处获取:parse and execute JS by C#

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

例如,以下代码:

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

将显示1.66666666666667

答案 15 :(得分:1)

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

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

Hello World:

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 

答案 16 :(得分:1)

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

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

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

spidermonkey-dotnet project and download page

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

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

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

答案 20 :(得分:0)

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

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

答案 21 :(得分:-5)

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