第16章基于動態(tài)編譯的VBNET腳本引擎_第1頁
第16章基于動態(tài)編譯的VBNET腳本引擎_第2頁
第16章基于動態(tài)編譯的VBNET腳本引擎_第3頁
第16章基于動態(tài)編譯的VBNET腳本引擎_第4頁
第16章基于動態(tài)編譯的VBNET腳本引擎_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第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類型標(biāo)記為“已過時”。在此不使用VsaEngine類型來實現(xiàn)VB.NET腳本,而是使用動態(tài)編譯技術(shù)來實現(xiàn)腳本引擎。16.1.2VB.NET腳本引擎設(shè)計這里將用倒推法來設(shè)計VB.NET腳本引擎,也就是從預(yù)期的最終使用結(jié)果來反過來設(shè)計腳本引擎。主程序?qū)凑彰Q來調(diào)用腳本方法,很顯然VB.NET代碼編譯生成的是一個.NET程序集類庫,為了方便起見,將所有的VB.NET腳本方法集中到一個VB.NET腳本類型。將腳本方法定義為靜態(tài)方法,主要有兩個好處,首先腳本引擎不必生成對象實例,其次能避免由于沒有生成對象實例而導(dǎo)致的空引用錯誤,這樣能減少腳本引擎的工作量。16.1.2VB.NET腳本引擎設(shè)計設(shè)計如下的參與動態(tài)編譯的VB.NET腳本代碼的結(jié)構(gòu):OptionStrictOffImportsSystemImportsMicrosoft.VisualBasicNamespaceNameSpaceXVBAScriptEngienModulemdlXVBAScriptEngine

sub腳本方法1()'VB.NET代碼

endsub

sub腳本方法2()'VB.NET代碼

endsub

EndModuleEndNamespace16.2軟件開發(fā)16.2.1參數(shù)控制屬性為腳本引擎類型定義了幾個屬性用于保存腳本引擎運行所必備的基礎(chǔ)數(shù)據(jù)。這些屬性中最重要的屬性就是用戶設(shè)置的原始腳本代碼文本。定義該屬性的代碼。16.2.2編譯腳本1.生成腳本代碼文本根據(jù)上述對運行時腳本的設(shè)計,用戶可以導(dǎo)入其他的命名空間,于是腳本引擎定義了SourceImports屬性來自定義導(dǎo)入的命名空間,定義該屬性的代碼如下:///<summary>///源代碼中使用的命名空間導(dǎo)入///</summary>privateStringCollectionmySourceImports=newStringCollection();///<summary>///源代碼中使用的命名空間導(dǎo)入///</summary>publicStringCollectionSourceImports{get{ returnmySourceImports; }}16.2.2編譯腳本在腳本引擎的初始化過程中,程序會默認(rèn)添加上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編譯器參數(shù)///</summary>privateCompilerParametersmyCompilerParameters=newCompilerParameters();///<summary>///引用的名稱列表///</summary>publicStringCollectionReferencedAssemblies{get{returnmyCompilerParameters.ReferencedAssemblies;}}16.2.2編譯腳本3.分析腳本程序集調(diào)用編譯器編譯腳本代碼成功地生成臨時程序集后,腳本引擎需要分析這個程序集,獲得所有的可用的腳本方法,其分析代碼為。這里配套定義了ScriptMethodInfo類型和myScriptMethods列表,定義它們的代碼。16.2.3調(diào)用腳本腳本引擎前期完成的大量的工作就是為了最后能調(diào)用腳本,為此定義了Execute函數(shù)用于調(diào)用指定名稱的腳本方法。定義該函數(shù)的代碼。16.3Window全局對象16.3.1成員屬性

首先定義一個UserInteractive屬性,該屬性指定應(yīng)用系統(tǒng)是否能和用戶桌面交互。定義該屬性的代碼如下:protectedboolbolUserInteractive=true;///<summary>///是否允許和用戶交互,也就是是否顯示用戶界面///</summary>///<remarks>當(dāng)應(yīng)用程序為ASP.NET或者WindowsService程序時不能有圖形化用戶界面,因此需要設(shè)置

///該屬性為false.</remarks>publicboolUserInteractive{get{returnbolUserInteractive;}set{bolUserInteractive=value;}}在這里還定義了其他的一些屬性,其定義的代碼。16.3.2延時調(diào)用和定時調(diào)用在Window全局對象中,使用System.Windows.Forms.Timer對象實現(xiàn)了延時調(diào)用和定時調(diào)用,由于定時器對象屬于用戶互換相關(guān)的功能,因此延時調(diào)用和定時調(diào)用受到UserInteractive屬性的影響。這里使用以下代碼來實現(xiàn)延時調(diào)用的功能。使用SetTimeout只會運行一次腳本方法,在調(diào)用SetTimeout函數(shù)準(zhǔn)備延時調(diào)用后可以調(diào)用ClearTimeout函數(shù)來立即取消延時調(diào)用。這里使用以下代碼來實現(xiàn)定時調(diào)用的功能。16.3.3映射應(yīng)用程序主窗體Window全局對象定義了一些屬性用于映射應(yīng)用程序主窗體,這里定義一個Title屬性應(yīng)用映射主窗體的文本,其代碼如下:///<summary>///窗體標(biāo)題///</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全局對象還定義了一些函數(shù)用于顯示一些消息對話框?qū)崿F(xiàn)用戶互換。主要代碼為。16.4測試腳本引擎在這里仿造Windows記事本開發(fā)了一個簡單的文本編輯器,其用戶界面如圖16.3所示。16.4測試腳本引擎主窗體中還定義了諸如Function_New,F(xiàn)unction_Open,F(xiàn)unction_Save等等函數(shù)用于實現(xiàn)對文檔的新建、打開文件和保存文件等處理。而工具條上的按鈕就是調(diào)用這些功能函數(shù)。定義這些功能函數(shù)的代碼。16.4.1文檔對象在主窗體中定義了一個DocumentClass的套嵌類型,該類型就是腳本中使用的document全局對象的類型,其代碼為。16.4.2創(chuàng)建全局對象容器為了在腳本代碼中使用document,window這樣的全局對象,得創(chuàng)建一個類型為GlobalObject的全局對象容器,定義該類型的代碼。16.4.3初始化腳本引擎在窗體的加載事件中我們初始化腳本引擎,其代碼為。程序試圖加載應(yīng)用程序所在目錄下的demo.vbs文件中的內(nèi)容作為默認(rèn)加載的腳本代碼,若成功加載并編譯成功則調(diào)用RefreshScriptMethodList來更新用戶界面中的可用腳本方法列表,定義RefreshScriptMethodList函數(shù)的代碼。16.4.3初始化腳本引擎這個函數(shù)的功能是,使用腳本引擎的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){//若腳本引擎內(nèi)容發(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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論