2008-12-10 117 views
34

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

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

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

在此先感谢。

UPDATE:

我能够使用瑞安的解决方案。我只是更新了从主干中获取最新版本的参考。它效果很好。谢谢瑞恩。

+0

顺便说一句,我可以在哪里获得已编译DLL的副本? (因为我自己懒得编译它,主要是因为我没有VS设置为执行C++) – 2008-12-10 19:10:08

+0

我更新了我的文章链接,下载我创建的测试项目。 – 2008-12-10 21:43:05

+0

对于那些刚刚查找此页面的用户,现在还有Codeplex上的V8.NET。 – 2013-06-01 19:32:09

回答

33

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

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

让lib编译成可以包含在混合模式项目中的方式有​​点难度。我必须修改用于/ MD和/ MDd的运行时库(在SConstruct文件中),以便它与/ clr开关兼容。

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

这里是什么样的使用看起来像我的测试应用程序的一个快速示例:

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

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

它可以运行更复杂的脚本,像一个base64编码器精也。但现在我只能从C++端添加自定义项目。

我愿意提供更多的信息+代码,如果任何人有兴趣,因为我可能从来没有选择这个项目备份。但是,恐怕有很多代码需要在这里发布,所以我们必须找到其他一些媒体,比如google代码或codePlex。

编辑:


OK,我已经上传的代码。我必须在此声明一个免责声明:该项目非常早,我最好是C++的业余爱好者,所以不要让自己的希望过高。此外,这个项目是在chrome发布之后创建/完成的,因此包含的v8版本可能会比较旧。

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

在包你会发现感兴趣的以下项目:

V8Net库\ V8.Net \ V8.Net.sln -这 是有解决方案管理 C++包装程序和一个C#控制台应用程序 进行测试。

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

希望它有帮助!

+0

“我必须修改用于/ MD和/ MDd的运行时库(在SConstruct文件中),以便它可以与/ clr开关兼容。 “ - 不是一个非常艰难的挑战! :) – leppie 2008-12-10 19:37:06

0

从我听说用IJW(Managed C++)编译它应该可行 - 但我可能真的错了,我从来没有碰过MC++。

13

退房v8sharp。它支持在.NET应用程序中执行JS。它还允许您使用v8引擎注册.NET类型,以便您的JS代码可以与.NET代码进行交互。我正在添加对挂钩功能/代理支持的支持。

18

您可以尝试使用Javascript .NET:

http://javascriptdotnet.codeplex.com/

它可以让你创建.NET一个V8上下文和注册CLI在它的对象,所以你可以操纵他们,并从JavaScript代码中调用成员。它在运行时编译Javascript。

检查出来。

0

您可以尝试V8.NET为好。

http://v8dotnet.codeplex.com/

它可以让您轻松地在比许多其他包装一个较低的水平集成了V8代码。