221

只是想知道是否有人尝试过将任何 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)。让普通人用 js 编程比 C# 更容易(也更安全)。

4

21 回答 21

99

尝试Javascript .NET。它托管在 GitHub 上它最初托管在 CodePlex 上,这里

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

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

于 2010-07-05T22:10:03.777 回答
90

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

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

于 2009-10-26T12:30:36.957 回答
58

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

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

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

ps:兼容.NET 4.0和4.5+

于 2013-06-14T14:18:36.207 回答
40

任何人都只是调整检查侏罗纪以及:

http://jurassic.codeplex.com/

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

https://github.com/paulbartrum/jurassic

于 2012-01-09T22:16:45.713 回答
8

你可以试试 IronJS,虽然它正在大力发展,但看起来很有希望。https://github.com/fholm/IronJS

于 2011-01-23T10:40:27.643 回答
7

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

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

于 2008-10-05T23:01:45.353 回答
6

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

.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.

于 2015-07-21T20:24:07.267 回答
5

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

于 2009-01-22T14:48:46.157 回答
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"));
于 2010-08-24T20:27:13.123 回答
5

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

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

于 2014-01-16T16:22:25.707 回答
4

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

它可以工作,尽管我不得不使用var a=A.createA();JavaScript 中的静态工厂 () 而不是var a=new A()语法。(ExposeType 函数只公开静态数据!)文档不多,源代码是用 Delphi Prism 编写的,这对我和 RedGate Reflector 来说是相当不寻常的。

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

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

于 2011-07-05T20:41:02.607 回答
2

还有使用 Internet Explorers Chakra 引擎的MsieJavaScriptEngine

于 2014-02-12T02:09:00.930 回答
2

Microsoft 记录的向任何事物添加脚本可扩展性的方法是 IActiveScript。您可以在任何 .NET 应用程序中使用 IActiveScript 来调用脚本逻辑。该逻辑可以与您放置在脚本上下文中的 .NET 对象相关联。

这个答案提供了一个执行此操作的应用程序,其中包含代码:

于 2011-09-15T16:10:51.027 回答
2

这里有一个用 C# 实现的ActiveX 脚本引擎主机:parse and execute JS by C#

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

例如,下面的代码:

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

将显示 1.66666666666667

于 2011-12-02T17:44:56.113 回答
1

试试ReoScript,一个用 C# 实现的开源 JavaScript 解释器。

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 
于 2013-02-12T08:19:23.317 回答
1

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

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

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

于 2008-10-06T03:57:52.700 回答
1

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

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

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

spidermonkey-dotnet 项目和下载页面

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

于 2011-07-27T04:38:13.647 回答
0

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

于 2009-03-06T20:25:47.327 回答
0

V8.NET是一个新手(截至 2013 年 4 月),它更紧密地封装了原生 V8 引擎功能。它允许对实施进行更多控制。

于 2013-05-29T21:30:47.550 回答
0

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

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

于 2017-05-10T17:59:38.770 回答
-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 应用程序,您还可以在离线桌面应用程序中使用它。

于 2012-08-23T17:51:52.103 回答