在.NET中可供集成的脚本语言有很多种选择,LUA 和 Python 都有非常成熟的解决方案。而JavaScript作为一种比较流行的脚本语言,也是非常不错的选择。
既然要使用JavaScript作为脚本引擎中的脚本语言,那么就需要在.NET中引入JavaScript执行环境(JavaScript Engine). 开源的JavaScript Engine有很多,比如:
除了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中的回调函数。回调函数的参数定义如下:
[csharp] view plain copy
print?
- /// <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 对象之间相互装换。
修改非托管代码? 这里不提供非托管代码源代码。
|