標籤:blog http color os io 使用 java ar for
基於.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()endlocal 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(導致不能多核問題),讓我無比之不喜歡,下一篇寫一下幾種語言的一個比較和個人看法吧
關於.net中的指令碼語言使用