在.NET中利用Google JS V8 Engine实现脚本引擎

来源:互联网 发布:java常见类 编辑:程序博客网 时间:2024/06/05 14:35

原文地址:http://blog.csdn.net/wangjia184/article/details/8520725


在.NET中可供集成的脚本语言有很多种选择,LUA 和 Python 都有非常成熟的解决方案。而JavaScript作为一种比较流行的脚本语言,也是非常不错的选择。


既然要使用JavaScript作为脚本引擎中的脚本语言,那么就需要在.NET中引入JavaScript执行环境(JavaScript Engine). 

开源的JavaScript Engine有很多,比如:

  • Firefox中用到的SpiderMonkey
  • Safari中用到的Squirrelfish
  • Chrome中用到的V8

除了IE的JS Engine比较垃圾外,这3个经过多年的竞争后性能差距已经不再那么明显了。

node.js也采用V8作为底层的执行引擎且使用在服务器环境中,这足以证明V8的稳定性。所以这里选择Google V8 Engine 作为JS的脚本引擎集成到.NET中。


猛击这里可以下载示例代码,这是一个经典的Web Application, 演示最简单的使用过程。



使用方法


将示例工程中的GoogleV8Engine.cs文件复制到你的项目中。将GoogleV8Engine_x64.dll 和 GoogleV8Engine_x86.dll 两个非托管DLL文件拷贝到工程部署的DLL目录下(ASP.Net拷贝到bin目录, WinForm只需要和其它EXE/DLL放在一起即可).


做完上面的操作就可以开始使用了。JavascriptEngine类中有下列方法可供你调用


  • void RegisterCommandCallback(CommandCallbackDelegate fun)

    如果你需要在JS中使用_exeCommand主动调用.NET的代码,则可以使用此方法注册.NET中的回调函数。回调函数的参数定义如下:

    /// <summary>/// 注册的回调方法,用于处理JS中的_exeCommand调用/// </summary>/// <param name="command">命令名称</param>/// <param name="arg1">参数1</param>/// <param name="arg2">参数2</param>/// <returns>返回给JS的字符串</returns>private string CommandCallback(string command, string arg1, string arg2){}

  • string Execute(string)

    此方法用于执行JS并返回执行结果。



线程安全性(Thread Safety)


Execute方法的调用中,非托管代码中利用V8的隔离(Isolate)模式来保证在不加锁的情况下的线程安全性。也就是说,多个线程对Execute方法的同时调用不会相互影响。

如果在多线程环境下,你可能需要借助TLS(Thread Local Storage)特性来回调函数中处理上下文相关的变量。因为设置的回调函数是全局的。



.NET与JS中 简单对象的转换


使用JavaScript作为脚本语言的一个优势, 就是能够很方便地用System.Web.Script.Serialization.JavaScriptSerializer 类 ,将 .NET中的对象(属性只具有通用的类型,如int/float/string/bool/循环或嵌套结构/等) 和JSON 对象之间相互装换。



修改非托管代码?


这里不提供非托管代码源代码。

原创粉丝点击