从 .NET 应用程序引用 Google 的 V8 引擎

IT技术 .net javascript interop v8 serverside-javascript
2021-02-26 18:09:38

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

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

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

提前致谢。

更新:

我能够使用 Ryan 的解决方案。我刚刚从主干更新了对构建的引用。它工作得很好。谢谢瑞安。

6个回答

我意识到这可能不是您问题的确切答案,但我想我会投入 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 代码。

希望能帮助到你!

瑞安:见我上面的更新。您的代码与来自主干的最新版本的构建配合良好。谢谢。
2021-04-20 18:09:38
“我不得不修改用于 /MD 和 /MDd 的运行时库(在 SConstruct 文件中),以便它与 /clr 开关兼容。” - 不是一个非常困难的挑战!:)
2021-04-25 18:09:38
瑞恩:谢谢你的帮助。我想用 /clr 开关进行构建 - 就像你所做的那样。我对 Scons 没有任何经验。介意让我更详细地了解您对 SConstruct 文件所做的更改。特别是在您指定/clr开关的地方。此外,它看起来像一个共享库,/MD已经被使用了。在此先感谢您的帮助。
2021-05-13 18:09:38
老实说,我不记得我的 v8 版本的确切细节。/clr 位于包装库中。基本上我必须创建一个稍微修改过的 v8.lib,这样我才能将它链接到我的混合模式 dll。我今天会尽量找时间把项目贴在某个地方供你下载。
2021-05-14 18:09:38
那么找到我们必须做的事情是。打字总是容易的部分。我想我缺乏 C++ 经验增加了一些挫败感。
2021-05-18 18:09:38

你可以试试 Javascript .NET:

http://javascriptdotnet.codeplex.com/

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

看看这个。

javascriptdotnet 现在是线程安全的。v8 的多个实例(隔离)可以同时运行,但它们不能交互。
2021-04-29 18:09:38
真的,很酷,但是非常不适合服务器端使用..因为 V8 引擎不是线程安全的。(请参阅:javascriptdotnet.codeplex.com/workitem/7062)这是一个无赖..
2021-05-09 18:09:38

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

v8sharp 很棒,我在我的项目中使用过。
2021-05-13 18:09:38

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

是的,我不久前听说过 JS DLR 实现,所以我首先研究了它。但是,不幸的是 MSFT 似乎还没有为 JS 发布任何东西,只有 IronPython。无赖。
2021-04-27 18:09:38
DLR 上的托管 JavaScript 已死。请参阅此答案:code.google.com/apis/v8/design.html
2021-05-16 18:09:38
我不明白 V8 设计文档与 DLR 上的 Javascript 有什么关系?DLR 上的 javascript 的重点不仅仅是为了纯粹的速度(尽管这将是一个很好的奖励),而是为了与现有的 .NET 生态系统进行干净的互操作,而 V8 没有做到这一点
2021-05-18 18:09:38

您也可以尝试 V8.NET。

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

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