将JavaScript引擎嵌入到.NET中


216

只是想知道是否有人尝试将任何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#更容易(更安全)。

Answers:


98

尝试使用Javascript .NET。它托管在GitHub上,最初托管于CodePlex,在此处

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

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


+1。这很简单,并且看起来很棒。
JC Inacio

6
有人声称这已经死在项目的讨论板上,除了基本示例之外的文档也很少,我正在努力在脚本中向.Net事件添加JavaScript事件处理程序。
艾伦·麦克唐纳

6
Noesis(原始开发公司)对该项目失去了兴趣,但最终决定将控制权交给社区。因此,现在有一个新版本,其中包含许多错误修复。不幸的是,尚不支持来自.Net的JavaScript回调。
奥利弗·博克

未来的另一个注意事项:Nuget软件包似乎以某种方式被借用了……当您安装该软件包时,它目前不能“正常工作”。
克里斯·普弗

3
由于javascriptdotnet已死,请考虑改用ClearScript(请参阅此答案
JB。和莫妮卡。

86

开源JavaScript解释器Jint(http://jint.codeplex.com)完全可以满足您的需求。

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


6
建立在DLR之上的另一种可能性:.NET的RemObjects脚本 remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
4

我认为它是用Delphi Prism / Oxygen编写的,并作为源代码提供,因此,如果您尚未购买上述产品的许可证,它就没有太大用处。我错了吗?如果任何地方都有二进制形式的版本,我想尝试一下。
Andrew Savinykh'4

2
RemObjects脚本是用Oxygene编写的,正确,但是您实际上不需要Oxygene许可证即可使用-其中一个,您可以从remobjects.com/free获取二进制安装程序,而另一个,您甚至可以免费获得Oxygene命令行编译器,如果您确实需要从源头自己重建它。毕竟,.NEt平台的一大好处是语言独立性。可以使用哪种语言编写库都无关紧要。
马克·霍夫曼

1
2011年的最新版本...侏罗纪似乎更好。
罗曼·斯塔科夫

3
:最后一个版本在2014年实际github.com/sebastienros/jint
MSFT -塞巴斯蒂安·罗斯

54

您可能也对Microsoft ClearScript感兴趣,该脚本 位于GitHub上,并根据Ms-Pl许可证发布。

我不是Microsoft的忠实拥护者,但我必须承认V8支持与Javascript.Net具有几乎相同的功能,更重要的是,该项目仍在维护中。就我而言,对代表的支持也比Spidermonkey-dotnet更好。

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

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


3
+1我完全不知道这个项目,似乎很有希望,但愿它不会像其他大多数尝试做同样事情的项目一样消失!
彼得

我发现使用Windows.JScript引擎在ClearScript中有所不同的一件事是.net对象现在区分大小写,而较旧的ScriptControl对象无所谓。
Brain2000 '17

这是我的ClearScript问题。运行时,它抱怨缺少dll。然后,我被要求安装额外的Visual Studio组件。没问题,除非我没有运行代码的管理员权限。如果它完全完全包含在dll中,那就太好了。
TatiOverflow

38

任何刚刚调出Jurassic的人:

http://jurassic.codeplex.com/

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

https://github.com/paulbartrum/jurassic


3
似乎这是具有本地.NET代码(而不是使用f.ex. V8引擎)并且仍受支持的少数几个项目之一(Ecmascript.net,jscript.net和许多其他项目似乎死)。+1,感谢您的链接!
atlaste 2013年

2
在检查完这些答案中列出的每个项目后,我就进入了侏罗纪时期。它是仍然被积极维护的仅有的两三个,它是真正的JS,经过了严格的测试,并且是纯.NET。
罗曼·斯塔科夫

会加我对《侏罗纪》的支持。它还具有序列化执行上下文的运行状态的能力。这意味着您可以从字面上保留JavaScript运行时,变量和所有内容。在某些情况下非常有用的功能。
Jerome Haltom

嗨wasabi,我无法找到有关如何序列化执行上下文的运行状态的任何信息。您是如何实现的?
亨宁


7

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

就我个人而言,我认为以某种方式集成V8会很酷,但是我没有下载源代码。希望我有时间去做一些实际的事情。


实际上,托管JScript是最符合我需求的东西。我知道它在Silverlight中,不知道它已发布。JScript.NET不是一个选择。我真的不想让用户访问整个.NET堆栈。我只需要几个可用于其应用程序的核心内置对象。
2008年

17
到了2009年,Managed JScript现在死了。
Alexander Abramov


5

嘿,在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对象?
Joy George Kunjikkuru 2015年


5

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

.dll使用Javascript 构建了一个文件,然后使用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


4

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

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

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

对于我来说,还必须安装某些东西,而不只是将程序集拖放到目录中...


2

Microsoft记录的将脚本可扩展性添加到任何内容的方法是IActiveScript。您可以从anyt .NET应用程序中使用IActiveScript来调用脚本逻辑。该逻辑可以处理放置在脚本上下文中的.NET对象。

该答案提供了一个执行该操作的应用程序,其代码如下:


2

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

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

例如,以下代码:

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

将显示1.66666666666667



1

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

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

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


2
是的,所有主要引擎通常都是嵌入式的,但障碍太多了。我研究嵌入指南,学习C(++)API。我希望已经完成一些集成工作。无法使用JScript.NET,实际的代码由Internet用户编写和执行。
2008年

1

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

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

我确实了解拥有托管javascript解决方案的愿望,但是在我使用过的所有托管javascript解决方案中,它们都缺少一些关键功能,这些功能无法使其健壮且易于使用。我自己正在等待IronJS的成熟。在等待的过程中,我很开心玩Spidermonkey-dotnet =)

Spidermonkey-dotnet项目和下载页面

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


1

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

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

0

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




-5

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

// 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应用程序,您可以在离线的桌面应用程序中使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.