基于.net中drl框架的脚本现在有很多,最近也由于工作的需要,目前有lua、python、ruby、javascript的.net实现,对ruby不怎么了解,python、lua、js就成了试验的对象。
先说lua怎么用吧
using (var l = new Lua())
{
// create a Lua script environment (global)
var g = l.CreateEnvironment();
g["mainform"] = this;
g.RegisterPackage("Chart", typeof(UserChart));
g.DoChunk(Application.StartupPath + "\config.lua");
}

  

  DuChunk也支持直接传入脚本的方法重载,通过字典的方法注入全局变量,个人挺喜欢lua的,但是lua的异常机制挺简单的通过
pcall保护方法来防止异常中断,也导致了不能很好的利用.net的异常机制。
local getResponse= function ()
local response = request.GetResponse()
response.Close()
end
local status,err=pcall(getResponse)

  

引入新的程序集,也挺麻烦的 clr.System.Reflection.Assembly:Load("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, publicKeyToken=b77a5c561934e089");
看到这publicKeyToken,大有点大不,测试了一下,缺一不可。
再说说Js
js用的是ironjs 开源的https://github.com/fholm/IronJS ,本挺喜欢的,可是看到官方一句介绍,郁闷了,脚本与宿主间是值传递的,
本来利用脚本不仅仅是处理一些动态计算的,也同时可以操纵.net的对象,现在看到值传递,当然也可以曲线救国,再重新传回来赋值就是,可总觉得,不利索,麻烦,结果自己测试了下,果然是值传递的,代码就没有留下来,直接放弃了。

最后说说python
现在ironpython是支持python 2.7的,之前是微软官方支持,现在好像是也让民间来维护了,但我和他接触了也有几年了,可以说是.net中实现动态脚本最成熟的,和.net支持也是最好的,同时他的异常机制可以和.net也完美结合。通过[]来支持泛型,相关不错。
var engine = Python.CreateEngine();
var env=engine.Runtime.Globals;
env.SetVariable("mainform",this) ;
engine.Runtime.LoadAssembly(Assembly.GetAssembly(typeof(int)));
engine.Runtime.LoadAssembly(Assembly.GetAssembly(typeof(MainForm)));
engine.Runtime.LoadAssembly(Assembly.GetAssembly(typeof(Color)));
var code = engine.CreateScriptSourceFromFile(Application.StartupPath + "\config.py");
code.Execute(env);

  

   引擎中引入程序集,挺方便的engine.Runtime.LoadAssembly(Assembly.GetAssembly(typeof(int)));

也可以在脚本中引用,这个比lua方便很多

import clr
clr.AddReference("System.Windows.Forms.DataVisualization")
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import * #这个和C#中 using System.Windows.Forms一个意思。

个人最终选择python,主要是它目前与.net结合,基于dlr,动态语言运行时最成熟,结合项目是最稳健的做法,但个人对python始终没有好感,主要其缩进的格式和GIL(导致不能多核问题),让我无比之不喜欢,下一篇写一下几种语言的一个比较和个人看法吧

最新文章

  1. php检测文件内容编码的方法
  2. Angular-ngtable联动全选
  3. Android菜鸟成长记5-ADB和sqllite
  4. 让C程序更高效的10种方法(转)
  5. 在本地(Eclipse)运行第一个strom-starter例子
  6. 原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法
  7. android异步加载图片
  8. Android 观察系统中短信内容的变化(内容观察者)
  9. [时间操作] C#DateFormat时间帮助类 (转载)
  10. Intrusion Detection of Specific Area Based on Video
  11. js跨域问题新方案
  12. java写文件读写操作(IO流,字节流)
  13. Maven引入jar的总结
  14. 非PE病毒介绍
  15. 优易软件-关于click事件在苹果手机失效的问题
  16. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)
  17. mongodb系列~ mongodb慢语句(1)
  18. (GoRails)使用vue和Vuex管理嵌套的JavaScript评论, 使用组件vue-map-field
  19. DeepMind已将AlphaGo引入多领域 Al泡沫严重
  20. gearman入门初步

热门文章

  1. Javascript之三种按钮点击事件
  2. 什么是C++标准库?
  3. MSSQL 数字钱转化为大写
  4. nodejs7.0 试用 async await
  5. spring中得到servletContext对象方法
  6. bzoj 1005 HNOI2008 明明的烦恼
  7. 我们一起学Windows Phone 8-01-开发环境搭建
  8. xamarin android——数据绑定到控件(二)
  9. js中使用使用原型(prototype)定义方法的好处
  10. 转发 PHP 资料(一)