




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第16章基于动态编译的VB.NET脚本引擎16.1脚本的原理16.2软件开发16.3Window全局对象16.4测试脚本引擎16.5部署脚本引擎16.1脚本的原理脚本也采用多种编程语言,比如JavaScript语言,VBScript语言或者其他的,若采用VB则称为VB脚本,图16.1所示的为脚本原理图。16.1脚本的原理图16.2所示的为常规编程开发软件的原理图。16.1.1VB.NET脚本原理VB.NET脚本就是采用VB.NET语法的脚本。VS.NET集成开发环境提供的宏也是采用VB.NET语法。微软.NET框架提供了一个脚本引擎,那就是在程序集microsoft.visualbasic.vsa.dll中的类型Microsfot.VisualBasic.Vsa.VsaEngine,该类型在微软.NET框架1.1和2.0中都有,使用起来不算容易,而且在微软.NET框架2.0中VsaEngine类型标记为“已过时”。在此不使用VsaEngine类型来实现VB.NET脚本,而是使用动态编译技术来实现脚本引擎。16.1.2VB.NET脚本引擎设计这里将用倒推法来设计VB.NET脚本引擎,也就是从预期的最终使用结果来反过来设计脚本引擎。主程序将按照名称来调用脚本方法,很显然VB.NET代码编译生成的是一个.NET程序集类库,为了方便起见,将所有的VB.NET脚本方法集中到一个VB.NET脚本类型。将脚本方法定义为静态方法,主要有两个好处,首先脚本引擎不必生成对象实例,其次能避免由于没有生成对象实例而导致的空引用错误,这样能减少脚本引擎的工作量。16.1.2VB.NET脚本引擎设计设计如下的参与动态编译的VB.NET脚本代码的结构:OptionStrictOffImportsSystemImportsMicrosoft.VisualBasicNamespaceNameSpaceXVBAScriptEngienModulemdlXVBAScriptEngine
sub脚本方法1()'VB.NET代码
endsub
sub脚本方法2()'VB.NET代码
endsub
EndModuleEndNamespace16.2软件开发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脚本代码文本后就可以编译了,为了提高效率,这里定义了一个静态myAssemblies的哈希列表变量,定义该变量的代码如下:///<summary>///所有缓存的程序集///</summary>privatestaticHashtablemyAssemblies=newHashtable();16.2.2编译脚本为了丰富脚本引擎的开发接口,这里使用以下代码定义了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属性,该属性指定应用系统是否能和用户桌面交互。定义该属性的代码如下: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记事本开发了一个简单的文本编辑器,其用户界面如图16.3所示。16.4测试脚本引擎主窗体中还定义了诸如Function_New,Function_Open,Function_Save等等函数用于实现对文档的新建、打开文件和保存文件等处理。而工具条上的按钮就是调用这些功能函数。定义这些功能函数的代码。16.4.1文档对象在主窗体中定义了一个DocumentClass的套嵌类型,该类型就是脚本中使用的document全局对象的类型,其代码为。16.4.2创建全局对象容器为了在脚本代码中使用document,window这样的全局对象,得创建一个类型为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){//若脚本引擎内容发生改变则刷新脚本方法下拉菜单项目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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 场平土石方施工方案
- TSIA 044-2024 软件企业高质量发展评估标准
- 经济责任审计报告
- 2025年度高校毕业生就业实习保障协议书
- 2025年度马术俱乐部项目合作协议书-马术俱乐部青少年马术俱乐部合作约定
- 二零二五年度政府办公楼无偿租用合同书
- 大连市2025年度租赁房屋押金管理合同
- 二零二五年度智慧城市建设项目多人合伙股东协议书
- 二零二五年度木材销售代理服务合同样本
- 2025年度湖南省劳动合同电子档案管理规范
- 劳务派遣投标方案(交通协管员外包项目)(技术方案)
- 金庸人物课件
- 2024年普通高等学校招生全国统一考试·新课标卷(化学)附试卷分析
- 人教版五年级下册数学第2单元测试题带答案
- 再生资源门店加盟协议书
- DB62-T 3268-2024 人民防空工程平战功能转换技术标准
- 天车工技能竞赛理论考试题库500题(含答案)
- 疗愈珠宝的科学与艺术
- 新能源汽车车位租赁合同
- 《人工智能导论》(第2版)高职全套教学课件
- 39 《出师表》对比阅读-2024-2025中考语文文言文阅读专项训练(含答案)
评论
0/150
提交评论