我正在构建一个 .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/