曆史版本
之前的兩篇文章分別介紹了Google的V8引擎,和開源的Javascript.NET(V8的.NET的Wrapper)。我在這兩者的基礎上進行了一個高層封裝(Efreda.Script),並最佳化了部分代碼,解決了原版Wrapper的一些異常,今天主要是對Efreda.Script進行了一些更新,以便更方便的在開發當中使用。
自訂映射別名
有使用了這個庫的朋友向我反映,如果不加在全域程式集,則在JS當中執行個體化.NET類會相當的麻煩,例如要用到下面的代碼。
function testCreateByFullName(){var proc=$.Create("System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",null);proc.StartInfo.FileName="calc";proc.Start();}
每次都必須寫一長串這樣的名稱,實在是降低了開發效率。
如果在每次程式啟動去載入全域程式集,問題也比較大,因為整個.NET的程式集相當多,這樣的話,又費時間又費記憶體(大概需要5-10秒左右的時間來載入程式集,大大降低了程式的運行效率),雖然可以做一個啟動畫面來讓使用者等待,但是對於一些小程式來說,這樣的做法未免太浪費資源了。
之前恰好看到了一篇開源的.NET指令碼引擎,對於在指令碼當中執行個體化.NET的Class,它使用了別名的方式,於是,我也重新增加了這樣的方式,可以通過代碼來添加映射,也可以通過設定檔來添加,具體代碼如下。
通過設定檔:
<configSections> <section name="Script" type="Efreda.Script.ScriptSection,Efreda.Script"/> </configSections> <!--指令碼引擎配置--> <!-- 參數說明: StartEngine:是否啟動指令碼引擎 RelativePath:是否為相對路徑 ScriptPath:指令碼目錄,根據RelativePath填寫相對或絕對路徑,相對路徑只需要填寫指令碼目錄名稱即可 CreateGACMapping:是否建立全域程式集映射,該操作耗時5-10秒,如果建立了映射,則可以簡單的通過限定名稱(命名空間+類名)在JS中執行個體化.NET類,而無需 指定強式名稱 CreateMappingAsyn:是否通過非同步方式建立映射,以免阻塞主線程 --> <Script StartEngine="True" RelativePath="True" ScriptPath="Scripts" CreateGACMapping="False" CreateMappingAsyn="False"> <Map Alias="Process" Type="System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </Script>
通過代碼:
JScriptManager.AddMap("Math", "System.Math, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
在JS指令碼當中執行個體化:
function testACreate(){var proc=$.ACreate("Process",null);proc.StartInfo.FileName="calc";proc.Start();}function testAStaticMethod(){var arg=new Array();arg[0]=-25;var rtv=$.AStaticMethod("Math","Abs",arg);return rtv;}
Efreda.Script 0.2.2源碼下載