35

我正在构建一个 .NET 3.5 应用程序,并且需要在服务器上评估 JS 代码 - 基本上是用户提供的可以在浏览器或服务器上工作的规则集。托管 JS 不是一个选项,因为 JS 代码将在运行时提供。Aptana 的 Jaxer 也不是一个选择。所以我正在考虑在我的应用程序中使用 V8 引擎的构建。

我成功地将源代码构建到 DLL 中,但该 DLL 不是托管库,也不是 COM。V8 只是普通的 C++。

关于如何在 C# 中与这种类型的 DLL 互操作的任何想法?此外,我对 SpiderMonkey 或其他 JS 引擎的其他建议持开放态度。

提前致谢。

更新:

我能够使用 Ryan 的解决方案。我刚刚更新了对来自主干的最新构建的引用。效果很好。谢谢瑞恩。

4

9 回答 9

34

我意识到这可能不是您问题的确切答案,但我想我会投入我的 2 美分,因为我怀疑很多人都尝试过这个。

我通过使用混合模式 C++ 创建了一个托管包装器来使其工作。还有其他方法可以做到这一点,但我将尝试制作一个可以从任何 .NET 语言使用的完整包装器。

让 lib 以一种可以包含在混合模式项目中的方式进行编译是一个挑战。我必须修改用于 /MD 和 /MDd 的运行时库(在 SConstruct 文件中),以便它与 /clr 开关兼容。

到目前为止,我只运行了简单的脚本,因为我还没有实现回调、自定义方法、对象等。

这是我的一个测试应用程序的使用情况的快速示例:

V8DotNet.Shell shell = new V8DotNet.Shell();

shell.ExecuteScript(@"print('V8 version is: ' + version());");

它也可以运行更复杂的脚本,例如 base64 编码器。但现在我只能从 c++ 端添加自定义项。

如果有人感兴趣,我愿意提供更多信息+代码,因为我可能永远不会选择这个项目。但是,恐怕这里的帖子要写很多代码,所以我们必须找到其他媒体,比如 google code 或 codePlex。

编辑:


好的,我已经上传了代码。我必须对此发表免责声明:该项目还很早,而且我充其量只是 C++ 的业余爱好者,所以不要抱太大希望。此外,该项目是在 chrome 发布后创建/完成的,因此包含的 v8 版本可能是旧的。

也就是说,这里是:http ://ryanscook.com/Files/V8-DotNet.zip (21.5 MB)

在包中,您会发现以下感兴趣的项目:

V8Net-Library\V8.Net\V8.Net.sln -这是具有托管 C++ 包装器项目和用于测试的 C# 控制台应用程序的解决方案。

Dependencies\V8 -这是我用来构建 V8 库的 V8 代码。

希望能帮助到你!

于 2008-12-10T19:29:02.807 回答
18

您可以尝试 Javascript .NET:

http://javascriptdotnet.codeplex.com/

它允许您从 .NET 创建 V8 上下文并在其中注册 CLI 对象,以便您可以操作它们并从 Javascript 代码调用成员。它在运行时编译 Javascript。

看看这个。

于 2010-07-05T22:34:49.377 回答
13

查看v8sharp。它支持在 .NET 应用程序中执行 JS。它还允许您使用 v8 引擎注册 .NET 类型,以便您的 JS 代码可以与您的 .NET 代码交互。我正在添加对挂钩函数/委托支持的支持。

于 2010-06-30T02:54:44.673 回答
1

Microsoft正在使用 DLR 在 CLR 上构建真正的 javascript - 而不是“JScript” - 运行时(以及 IronPython、IronRuby 和 VB10),但我找不到任何下载或内容。也许这将与 C# 4 一起出现?

于 2008-12-10T20:13:14.530 回答
1

您也可以尝试 V8.NET。

https://www.nuget.org/packages/V8.Net/

它允许您在比许多其他包装器更低的级别轻松地将代码与 V8 集成。它还支持 .Net 4.6.1+ 和 .Net Standard 2.0+ (.Net Core)。

于 2013-06-01T19:50:28.207 回答
0

从我听到的用 IJW(托管 C++)编译它应该可以工作 - 但我可能真的错了,我从未接触过 MC++。

于 2008-12-10T19:48:16.530 回答
0

我猜 gatapia 已经用jish取代了js.net

于 2012-05-05T17:59:18.230 回答
0

死灵术。
根据 2018 和 .NET Core 2.0+
,您可以使用vroomjs-core

执行一些 Javascript:

using (var engine = new JsEngine())
{
    using (var context = engine.CreateContext())
    {
        var x = (double)context.Execute("3.14159+2.71828");
        Console.WriteLine(x);  // prints 5.85987
    }
}

创建并返回一个 Javascript 对象,然后在其上调用一个方法:

using (JsEngine js = new JsEngine(4, 32))
{
    using (JsContext context = js.CreateContext())
    {
        // Create a global variable on the JS side.
        context.Execute("var x = {'answer':42, 'tellme':function (x) { return x+' '+this.answer; }}");
        // Get it and use "dynamic" to tell the compiler to use runtime binding.
        dynamic x = context.GetVariable("x");
        // Call the method and print the result. This will print:
        // "What is the answer to ...? 42"
        Console.WriteLine(x.tellme("What is the answer to ...?"));
    }
}

从 Javascript 访问 CLR 对象的属性和调用方法:

class Test
{
    public int Value { get; set; }
    public void PrintValue(string msg)
    {
        Console.WriteLine(msg+" "+Value);
    }
}

using (JsEngine js = new JsEngine(4, 32))
{
    using (JsContext context = js.CreateContext())
    {
        context.SetVariable("m", new Test());
        // Sets the property from Javascript.
        context.Execute("m.Value = 42");
        // Call a method on the CLR object from Javascript. This prints:
        // "And the answer is (again!): 42"
        context.Execute("m.PrintValue('And the answer is (again!):')");
    }
}
于 2018-07-22T19:31:33.143 回答
0

由于这个问题是不久前发布的,我想我会提供一些更新。

微软制作了ClearScript脚本引擎,支持 V8、JScript 和 VBScript。

您可以轻松添加控制台等 C# 类型并在脚本中使用它。添加 WPF 按钮类型并创建一个也没有问题。github 中有一些很好的例子,所以我建议任何阅读这篇文章的人快速浏览一下。

于 2020-12-04T15:05:06.927 回答