提问人: 提问时间:10/6/2008 最后编辑:3 revs, 2 users 100%aprilchild 更新时间:3/7/2019 访问量:187071
将 JavaScript 引擎嵌入 .NET [已关闭]
Embedding JavaScript engine into .NET [closed]
问:
我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便用事实和引文来回答。
5年前关闭。
只是想知道是否有人曾经尝试过将任何 JS 引擎嵌入并实际集成到 .NET 环境中。我可以找到并实际使用(经过很多痛苦和努力,因为它已经过时且尚未完成)spidermonkey-dotnet 项目。有人在这方面有经验吗?像 SquirrelFish、V8 这样的引擎。
并不是说我对 Mozilla 的 Spidermonkey 不满意(将它用于类似 Rails 的迷你框架,用于核心 ASP.NET 应用程序中的自定义组件),但我仍然想进一步探索这些选项。命令行解决方案不是我需要的,我不能依赖 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)。与 C# 相比,允许普通人使用 js 编程要容易得多(也更安全)。
答:
我想我仍然不清楚你要做什么,但 JScript.NET 可能值得研究,尽管托管 JScript 似乎更适合您的需求(它更像是 JavaScript 而不是 JScript.NET)。
就我个人而言,我认为以某种方式集成 V8 会很酷,但我并没有通过下载源代码;希望我有时间真正用它做点什么。
评论
我相信所有主要的开源 JS 引擎(JavaScriptCore、SpiderMonkey、V8 和 KJS)都提供了嵌入 API。我唯一真正直接熟悉的是 JavaScriptCore(这是 SquirrelFish 所在的 JS 引擎的名称),它提供了一个纯 C API。如果内存可用(我已经有一段时间没有使用 .NET),.NET 对 C API 中的链接有相当好的支持。
老实说,我不确定其他引擎的 API 是什么样的,但我知道它们都提供了它们。
也就是说,根据您的目的,JScript.NET 可能是最好的,因为所有这些其他引擎都要求您将它们包含在您的应用程序中,因为 JSC 是唯一实际附带操作系统的引擎,但该操作系统是 MacOS :D
评论
如果语言不是问题(任何沙盒脚本),那么 .NET 有 LUA。.NET Framework 的 Silverlight 版本也是沙盒式的 afaik。
使用 JSCRIPT.NET 获取 js 的库 (dll)。然后在您的 .NET 应用程序中引用此 dll,您就在那里。做!
开源 JavaScript 解释器 Jint (http://jint.codeplex.com) 完全符合您的需求。
编辑:
该项目已完全重写,现在托管在 Github 上,网址为 https://github.com/sebastienros/jint
评论
试试 Javascript .NET。它托管在 GitHub 上 它最初托管在 CodePlex 上,这里)
项目讨论:http://javascriptdotnet.codeplex.com/discussions
它实现了 Google V8。您可以使用它直接从 .NET 代码编译和运行 JavaScript,并提供 JavaScript 代码要使用的 CLI 对象。它从 JavaScript 生成本机代码。
评论
嘿,在 codeplex (http://javascriptdotnet.codeplex.com/) 上查看 Javascript .NET,版本 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"));
评论
您可以尝试 ironJS,尽管它正在大量开发中,但看起来很有前途。https://github.com/fholm/IronJS
评论
我刚刚尝试了 .Net 的 RemObjects 脚本。
它有效,尽管我不得不使用 JavaScript 中的静态工厂 () 而不是语法。(ExposeType 函数仅公开静态信息!
没有太多的文档,源代码是用 Delphi Prism 编写的,这对我和 RedGate Reflector 来说是相当不寻常的。var a=A.createA();
var a=new A()
因此:易于使用和设置,但对高级方案没有多大帮助。
还必须安装一些东西,而不仅仅是将程序集放在目录中,这对我来说是负面的......
我知道我正在打开一个旧线程,但我在smnet(spidermonkey-dotnet)上做了很多工作。近年来。它的主要开发重点是将 .net 对象无缝嵌入到 spidermonkey 引擎中。它支持从 js 值到 .net 对象的各种转换。其中一些包括代表和活动。
只是说它可能值得检查一下,因为它:)有一些稳定的发展。 我确实通过错误修复和新功能使 SVN 存储库保持最新状态。源和项目解决方案文件配置为在下载时成功生成。如果在使用它时遇到任何问题,请随时打开讨论。
我确实理解拥有托管 javascript 解决方案的愿望,但在我使用过的所有托管 javascript 中,它们都非常缺乏一些关键功能,这些功能有助于使它们既健壮又易于使用。我自己正在等待 IronJS 成熟一点。在我等待的时候,我玩得很开心 spidermonkey-dotnet =)
编辑:今天下午创建了文档维基页面。
Microsoft 记录的向任何内容添加脚本扩展性的方法是 IActiveScript。可以在 anyt .NET 应用中使用 IActiveScript 来调用脚本逻辑。该逻辑可以在已放入脚本上下文的 .NET 对象上进行分组。
这个答案提供了一个应用程序,它使用代码来做到这一点:
此处提供了 C# 中 ActiveX 脚本引擎主机的实现:通过 C# 解析和执行 JS
它允许在本机 32 位或 64 位进程中直接从 C# 使用 Javascript(或 VBScript)。完整源代码是 ~500 行 C# 代码。它仅对已安装的 JScript(或 VBScript)引擎 DLL 具有隐式依赖关系。
例如,以下代码:
Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3"));
将显示 1.666666666666667
任何刚刚收看的人都可以看看侏罗纪:
编辑:这已经移到了GitHub上(乍一看似乎很活跃)
https://github.com/paulbartrum/jurassic
评论
现在,使用 View 引擎可以实现。代码将是这样的: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>
并且不仅适用于 MVC4 或其他 Web 应用程序,您可以在脱机桌面应用程序中使用它。Razor
试试 ReoScript,一个用 C# 实现的开源 JavaScript 解释器。
ReoScript 使您的应用程序可以执行 JavaScript。它有各种各样的扩展方法,如SetVariable、Function Extension、using 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
V8.NET 是一个新孩子(截至 2013 年 4 月),它更紧密地包裹了原生 V8 引擎功能。它允许对实现进行更多控制。
评论
您可能还对 Microsoft ClearScript 感兴趣,它托管在 GitHub 上并在 Ms-Pl 许可下发布。
我不是Microsoft粉丝,但我必须承认 V8 支持具有与 Javascript.Net 大致相同的功能,更重要的是,该项目仍在维护。就我而言,对委托的支持也比 Spidermonkey-dotnet 更好。
ps:它还支持 JScript 和 VBScript,但我们对这个旧东西不感兴趣。
ps:它与 .NET 4.0 和 4.5+ 兼容
评论
您可以在 C# 中使用 Chakra 引擎。以下是 msdn 上的一篇文章,展示了如何:
http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880
还有 MsieJavaScriptEngine,它使用 Internet Explorer 的脉轮引擎
我想出了一个更简单的解决方案。
我使用 Javascript 构建了一个文件,然后使用 VS2013 开发人员命令提示符中提供的 Javascript 编译器对其进行编译。.dll
一旦我们有了它,我们只需将其添加到文件夹中,然后在需要评估 Javascript 语句的项目中引用它。.dll
\Support
创建详细步骤:.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
您可以使用 Rhino 一个用 Java 编写的 Mozilla Javascript 引擎,并将其与 IKVM 一起使用,这里有一些说明
说明:https://www.codeproject.com/Articles/41792/Embedding-JavaScript-into-C-with-Rhino-and-IKVM
评论