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

标签 .net javascript interop v8 serverside-javascript

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

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

关于如何在 C# 中与这种类型的 DLL 互操作有什么想法吗?此外,我愿意接受有关 SpiderMonkey 或其他 JS 引擎的其他建议。

提前致谢。

更新:

我能够使用 Ryan 的解决方案。我刚刚从 trunk 更新了对构建的引用。效果很好。谢谢瑞安。

最佳答案

我知道这可能不是您问题的准确答案,但我想我会投入 2 美分的值(value),因为我怀疑很多人都试过这个。

我通过使用混合模式 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.5MB)

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

V8Net-Library\V8.Net\V8.Net.sln - This is the solution that has the managed C++ wrapper proj and a C# console app for testing.

Dependencies\V8 - This is my V8 code that I used to build the V8 lib.

希望对您有所帮助!

关于.net - 从 .NET 应用程序引用 Google 的 V8 引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356948/

相关文章:

c# - 如何使用线性索引在多维数组中设置值

javascript - 将 onclick 事件的父表单传递给 javascript 函数

.net - 64 到 32 位互操作 - 如何?

java - 如何将类对象从 Scala 传递给 Java?

c# - Marshal.GetActiveObject ("Outlook.Application") 在使用提升的权限进行调试时抛出 MK_E_UNAVAILABLE

c# - 如何使用 .NET/C# 进行可靠的 SerialPort 编程?

c# - 互锁多变

javascript - 当textarea中的值改变时如何调用javascript函数?

javascript - 如何从 Three.js 中的 3D 点创建 3D 三次贝塞尔曲线三 Angular 形?

c# - 使用 C# 格式化 Excel 文件