![第16章基于動態(tài)編譯的VBNET腳本引擎_第1頁](http://file4.renrendoc.com/view/f7fbe2581c277fad6a881afffac0b4d4/f7fbe2581c277fad6a881afffac0b4d41.gif)
![第16章基于動態(tài)編譯的VBNET腳本引擎_第2頁](http://file4.renrendoc.com/view/f7fbe2581c277fad6a881afffac0b4d4/f7fbe2581c277fad6a881afffac0b4d42.gif)
![第16章基于動態(tài)編譯的VBNET腳本引擎_第3頁](http://file4.renrendoc.com/view/f7fbe2581c277fad6a881afffac0b4d4/f7fbe2581c277fad6a881afffac0b4d43.gif)
![第16章基于動態(tài)編譯的VBNET腳本引擎_第4頁](http://file4.renrendoc.com/view/f7fbe2581c277fad6a881afffac0b4d4/f7fbe2581c277fad6a881afffac0b4d44.gif)
![第16章基于動態(tài)編譯的VBNET腳本引擎_第5頁](http://file4.renrendoc.com/view/f7fbe2581c277fad6a881afffac0b4d4/f7fbe2581c277fad6a881afffac0b4d45.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第16章基于動態(tài)編譯的VB.NET腳本引擎16.1腳本的原理16.2軟件開發(fā)16.3Window全局對象16.4測試腳本引擎16.5部署腳本引擎16.1腳本的原理腳本也采用多種編程語言,比如JavaScript語言,VBScript語言或者其他的,若采用VB則稱為VB腳本,圖16.1所示的為腳本原理圖。16.1腳本的原理圖16.2所示的為常規(guī)編程開發(fā)軟件的原理圖。16.1.1VB.NET腳本原理VB.NET腳本就是采用VB.NET語法的腳本。VS.NET集成開發(fā)環(huán)境提供的宏也是采用VB.NET語法。微軟.NET框架提供了一個腳本引擎,那就是在程序集microsoft.visualbasic.vsa.dll中的類型Microsfot.VisualBasic.Vsa.VsaEngine,該類型在微軟.NET框架1.1和2.0中都有,使用起來不算容易,而且在微軟.NET框架2.0中VsaEngine類型標記為“已過時”。在此不使用VsaEngine類型來實現VB.NET腳本,而是使用動態(tài)編譯技術來實現腳本引擎。16.1.2VB.NET腳本引擎設計這里將用倒推法來設計VB.NET腳本引擎,也就是從預期的最終使用結果來反過來設計腳本引擎。主程序將按照名稱來調用腳本方法,很顯然VB.NET代碼編譯生成的是一個.NET程序集類庫,為了方便起見,將所有的VB.NET腳本方法集中到一個VB.NET腳本類型。將腳本方法定義為靜態(tài)方法,主要有兩個好處,首先腳本引擎不必生成對象實例,其次能避免由于沒有生成對象實例而導致的空引用錯誤,這樣能減少腳本引擎的工作量。16.1.2VB.NET腳本引擎設計設計如下的參與動態(tài)編譯的VB.NET腳本代碼的結構:OptionStrictOffImportsSystemImportsMicrosoft.VisualBasicNamespaceNameSpaceXVBAScriptEngienModulemdlXVBAScriptEngine
sub腳本方法1()'VB.NET代碼
endsub
sub腳本方法2()'VB.NET代碼
endsub
EndModuleEndNamespace16.2軟件開發(fā)16.2.1參數控制屬性為腳本引擎類型定義了幾個屬性用于保存腳本引擎運行所必備的基礎數據。這些屬性中最重要的屬性就是用戶設置的原始腳本代碼文本。定義該屬性的代碼。16.2.2編譯腳本1.生成腳本代碼文本根據上述對運行時腳本的設計,用戶可以導入其他的命名空間,于是腳本引擎定義了SourceImports屬性來自定義導入的命名空間,定義該屬性的代碼如下:///<summary>///源代碼中使用的命名空間導入///</summary>privateStringCollectionmySourceImports=newStringCollection();///<summary>///源代碼中使用的命名空間導入///</summary>publicStringCollectionSourceImports{get{ returnmySourceImports; }}16.2.2編譯腳本在腳本引擎的初始化過程中,程序會默認添加上System和Microsoft.VisualBasic兩個命名空間。隨后程序使用以下代碼來生成實際參與編輯的腳本代碼文本://生成編譯用的完整的VB源代碼stringModuleName="mdlXVBAScriptEngine";stringnsName="NameSpaceXVBAScriptEngien";System.Text.StringBuildermySource=newSystem.Text.StringBuilder();mySource.Append("OptionStrictOff");foreach(stringimportinthis.mySourceImports){mySource.Append("\r\nImports"+import);}mySource.Append("\r\nNamespace"+nsName);mySource.Append("\r\nModule"+ModuleName);mySource.Append("\r\n");mySource.Append(this.strScriptText);mySource.Append("\r\nEndModule");mySource.Append("\r\nEndNamespace");stringstrRuntimeSource=mySource.ToString();16.2.2編譯腳本2.編譯腳本程序生成完整的VB.NET腳本代碼文本后就可以編譯了,為了提高效率,這里定義了一個靜態(tài)myAssemblies的哈希列表變量,定義該變量的代碼如下:///<summary>///所有緩存的程序集///</summary>privatestaticHashtablemyAssemblies=newHashtable();16.2.2編譯腳本為了豐富腳本引擎的開發(fā)接口,這里使用以下代碼定義了ReferencedAssemblies屬性。///<summary>///VB.NET編譯器參數///</summary>privateCompilerParametersmyCompilerParameters=newCompilerParameters();///<summary>///引用的名稱列表///</summary>publicStringCollectionReferencedAssemblies{get{returnmyCompilerParameters.ReferencedAssemblies;}}16.2.2編譯腳本3.分析腳本程序集調用編譯器編譯腳本代碼成功地生成臨時程序集后,腳本引擎需要分析這個程序集,獲得所有的可用的腳本方法,其分析代碼為。這里配套定義了ScriptMethodInfo類型和myScriptMethods列表,定義它們的代碼。16.2.3調用腳本腳本引擎前期完成的大量的工作就是為了最后能調用腳本,為此定義了Execute函數用于調用指定名稱的腳本方法。定義該函數的代碼。16.3Window全局對象16.3.1成員屬性
首先定義一個UserInteractive屬性,該屬性指定應用系統(tǒng)是否能和用戶桌面交互。定義該屬性的代碼如下:protectedboolbolUserInteractive=true;///<summary>///是否允許和用戶交互,也就是是否顯示用戶界面///</summary>///<remarks>當應用程序為ASP.NET或者WindowsService程序時不能有圖形化用戶界面,因此需要設置
///該屬性為false.</remarks>publicboolUserInteractive{get{returnbolUserInteractive;}set{bolUserInteractive=value;}}在這里還定義了其他的一些屬性,其定義的代碼。16.3.2延時調用和定時調用在Window全局對象中,使用System.Windows.Forms.Timer對象實現了延時調用和定時調用,由于定時器對象屬于用戶互換相關的功能,因此延時調用和定時調用受到UserInteractive屬性的影響。這里使用以下代碼來實現延時調用的功能。使用SetTimeout只會運行一次腳本方法,在調用SetTimeout函數準備延時調用后可以調用ClearTimeout函數來立即取消延時調用。這里使用以下代碼來實現定時調用的功能。16.3.3映射應用程序主窗體Window全局對象定義了一些屬性用于映射應用程序主窗體,這里定義一個Title屬性應用映射主窗體的文本,其代碼如下:///<summary>///窗體標題///</summary>publicstringTitle{get{System.Windows.Forms.Formfrm=myParentWindowasSystem.Windows.Forms.Form;if(frm==null){ return""; }else{ returnfrm.Text; }}set{System.Windows.Forms.Formfrm=myParentWindowasSystem.Windows.Forms.Form;if(frm!=null){ frm.Text=value; }}}16.3.4顯示消息框Window全局對象還定義了一些函數用于顯示一些消息對話框實現用戶互換。主要代碼為。16.4測試腳本引擎在這里仿造Windows記事本開發(fā)了一個簡單的文本編輯器,其用戶界面如圖16.3所示。16.4測試腳本引擎主窗體中還定義了諸如Function_New,Function_Open,Function_Save等等函數用于實現對文檔的新建、打開文件和保存文件等處理。而工具條上的按鈕就是調用這些功能函數。定義這些功能函數的代碼。16.4.1文檔對象在主窗體中定義了一個DocumentClass的套嵌類型,該類型就是腳本中使用的document全局對象的類型,其代碼為。16.4.2創(chuàng)建全局對象容器為了在腳本代碼中使用document,window這樣的全局對象,得創(chuàng)建一個類型為GlobalObject的全局對象容器,定義該類型的代碼。16.4.3初始化腳本引擎在窗體的加載事件中我們初始化腳本引擎,其代碼為。程序試圖加載應用程序所在目錄下的demo.vbs文件中的內容作為默認加載的腳本代碼,若成功加載并編譯成功則調用RefreshScriptMethodList來更新用戶界面中的可用腳本方法列表,定義RefreshScriptMethodList函數的代碼。16.4.3初始化腳本引擎這個函數的功能是,使用腳本引擎的ScriptMethodNames屬性獲得所有可用腳本方法的名稱,然后添加到工具條的“運行腳本”的下拉菜單中,于是可以到達如圖16.4所示的界面效果。16.4.4編輯腳本工具條上有一個“編輯腳本”的按鈕,該按鈕是點擊事件處理過程為:///<summary>///編輯腳本按鈕事件處理///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbtnLoadScript_Click(objectsender,EventArgse){//顯示腳本文本編輯對話框using(dlgEditScriptdlg=newdlgEditScript()){intVersionBack=myVBAEngine.ScriptVersion;dlg.VBAEngine=this.myVBAEngine;dlg.ShowDialog(this);if(VersionBack!=myVBAEngine.ScriptVersion){//若腳本引擎內容發(fā)生改變則刷新腳本方法下拉菜單項目RefreshScriptMethodList();}}}16.4.4編輯腳本dlgEditScript是一個腳本代碼編輯對話框,其用戶界面如圖16.5所示。16.4.5運行腳本在屬性該下拉菜單的RefreshScriptMethodList中為每個菜單項目的點擊事件綁定了ScriptItem_Click方法,該ScriptItem_Click代碼為:///<summary>///運行腳本的下拉菜單項目點擊事件處理///</summary>///<paramname="sender"></param>///<para
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作合資合同范例
- 沖壓模合同范例
- 保姆用工簡易合同范例
- 噴砂勞務合同范本
- 買賣合同解除合同范例
- 專利申請權轉讓合同范本2025
- 人教部編版九年級道德與法治下冊:6.1 《學無止境》聽課評課記錄
- 湘教版數學九年級上冊《3.4.2相似三角形的性質》聽評課記錄2
- 無錫蘇教版五年級數學下冊第四單元第2課時《分數與除法的關系》聽評課記錄
- 九年級語文聽評課記錄
- TSXDZ 052-2020 煤礦礦圖管理辦法
- GB/T 7631.18-2017潤滑劑、工業(yè)用油和有關產品(L類)的分類第18部分:Y組(其他應用)
- 2022年第六屆【普譯獎】全國大學生英語翻譯大賽
- GB/T 14258-2003信息技術自動識別與數據采集技術條碼符號印制質量的檢驗
- 政府資金項目(榮譽)申報獎勵辦法
- 最新如何進行隔代教育專業(yè)知識講座課件
- 當前警察職務犯罪的特征、原因及防范,司法制度論文
- 奧特萊斯專題報告(經典)-課件
- 《新制度經濟學》配套教學課件
- 計算機文化基礎單元設計-windows
- DNA 親子鑒定手冊 模板
評論
0/150
提交評論