活着的死人 发表于 2015-1-16 22:44:54

ASP编程:在C#中挪用VBScript、JavaScript等剧本...

帮助用户快速实现各种应用服务,ASP商有整合各方面资源的能力,可在短期内为用户提供所需的解决方案。例如,典型的ERP安装,如果要在客户端安装的话需要半年到二年的时间,但是美国的一些ASP商如USI和CORIO能在90—120天内提供ERP应用方案。javascript|vbscript|剧本之前在唱工作流(workflow)项目标时分,内里有一项就是在用户制订流程界说时能够编写剧本来把持举动的跳转,而这些剧本界说后存在数据库中,当流程启动的时分,事情流引擎会把持举动实行按次,串型的两个举动对照复杂,但有的举动到下一个举动有前提判别,大概存在多个分支,复杂的还好,只需在数据库表中加个字段就能够完成,庞大一点的就必要经由过程剧本完成了。事先履历不敷,几天都没找到疾速的办理举措,想本人写一个自界说剧本引擎没有掌控,并且工夫也不敷,仍是在网上找找看吧,花了一些工夫,仍是找到了一个自以为对照好的办理举措,写出来同人人分享。
上面经由过程两部分来讲明完成和使用。

一.利用MSScriptControl
到微软的网站高低载WindowsScriptControl,它是一个ActiveX(R)控件,以是在.NET中利用我Interop了一下。下载安装完成后,新建一个C#的Windows使用程序项目,在办理计划资本办理器当选中援用节点,右键点击选择增加援用菜单,弹出增加援用对话框,单击扫瞄找到安装WindowsScriptControl的目次,拔取msscript.ocx文件断定。那末在援用节点下会增添一个MSScriptControl组件,上面是他Interop后的一切工具。



ScriptControl对撑持ActiveX(TM)Script的宿主Script引擎供应复杂接口。接上去我们对被转化成ScriptControlClass类的ScriptControl的属性和办法举行一些申明。属性AllowUI属性:使用于ScriptControl自己或Scirpt引擎显现的用户界面元素,可读写。CodeObject属性:前往工具,该工具用于挪用指定模块的公用成员。只读。Error属性:前往Error工具,个中包括所产生的最初一个毛病的相干具体信息。只读。Language属性:设置或前往正在利用的Script言语称号。可读写。Modules属性:为ScriptControl工具前往模块汇合。只读。Procedures属性:前往在指定模块中界说的历程汇合。只读。SitehWnd属性:设置或前往窗口的hWnd,经由过程实行Script代码,此窗口用于显现对话框和其他用户界面元素。可读写。State属性:设置或前往ScriptControl工具的形式。可读写。Timeout属性:设置或前往工夫(毫秒),此工夫后用户可选择中断Script代码的实行或同意代码持续实行。可读写。UseSafeSubset属性:设置或前往Boolean值,指明宿主使用程序是不是有保密性请求。假如宿主使用程序必要平安把持,则UseSafeSubset为True,不然为False。可读写。办法AddCode办法:向模块增加指定代码。可屡次挪用AddCode办法。AddObject办法:使主机工具模子对Script引擎可用。Eval办法:盘算表达式并前往了局。ExecuteStatement办法:实行指定的语句。Reset办法:保持一切已增加到ScriptControl中的Script代码和工具。Run办法:运转指定历程。事务Error事务:呈现运转时毛病时,产生此事务。Timeout事务:当超越了Timeout属性指定的工夫且用户在了局对话框当选定了End时,产生此事务。增补几点AllowUI属性假如设置为false,则显现对话框之类的语句不起感化,如在VBScript中MsgBox语句,JavaScript中的alert等,而且假如实行的剧本超越TimeOut设置的毫秒数,也不会跳出超越工夫提示的对话框,反之则相反;从头设置Language属性会清空AddCode加载的代码;关于TimeOut属性,产生超不时,ScriptControl反省工具的AllowUI属性,断定是不是同意显现用户界面元素。假如读者必要更具体的懂得,能够检察MSDN文档。为了使控件更简单利用,我用一个ScriptEngine类包装了一下,上面是完全代码:
usingSystem;usingMSScriptControl;usingSystem.Text;namespaceZZ{///<summary>///剧本范例///</summary>publicenumScriptLanguage{///<summary>///JScript剧本言语///</summary>JScript,///<summary>///VBscript剧本言语///</summary>VBscript,///<summary>///JavaScript剧本言语///</summary>JavaScript}///<summary>///剧本运转毛病代办署理///</summary>publicdelegatevoidRunErrorHandler();///<summary>///剧本运转超时期理///</summary>publicdelegatevoidRunTimeoutHandler();///<summary>///ScriptEngine类///</summary>publicclassScriptEngine{privateScriptControlmsc;//界说剧本运转毛病事务publiceventRunErrorHandlerRunError;//界说剧本运转超时势件publiceventRunTimeoutHandlerRunTimeout;///<summary>///机关函数///</summary>publicScriptEngine():this(ScriptLanguage.VBscript){}///<summary>///机关函数///</summary>///<paramname="language">剧本范例</param>publicScriptEngine(ScriptLanguagelanguage){this.msc=newScriptControlClass();this.msc.UseSafeSubset=true;this.msc.Language=language.ToString();((DScriptControlSource_Event)this.msc).Error+=newDScriptControlSource_ErrorEventHandler(ScriptEngine_Error);((DScriptControlSource_Event)this.msc).Timeout+=newDScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);}///<summary>///运转Eval办法///</summary>///<paramname="expression">表达式</param>///<paramname="codeBody">函数体</param>///<returns>前往值object</returns>publicobjectEval(stringexpression,stringcodeBody){msc.AddCode(codeBody);returnmsc.Eval(expression);}///<summary>///运转Eval办法///</summary>///<paramname="language">剧本言语</param>///<paramname="expression">表达式</param>///<paramname="codeBody">函数体</param>///<returns>前往值object</returns>publicobjectEval(ScriptLanguagelanguage,stringexpression,stringcodeBody){if(this.Language!=language)this.Language=language;returnEval(expression,codeBody);}///<summary>///运转Run办法///</summary>///<paramname="mainFunctionName">出口函数称号</param>///<paramname="parameters">参数</param>///<paramname="codeBody">函数体</param>///<returns>前往值object</returns>publicobjectRun(stringmainFunctionName,object[]parameters,stringcodeBody){this.msc.AddCode(codeBody);returnmsc.Run(mainFunctionName,refparameters);}///<summary>///运转Run办法///</summary>///<paramname="language">剧本言语</param>///<paramname="mainFunctionName">出口函数称号</param>///<paramname="parameters">参数</param>///<paramname="codeBody">函数体</param>///<returns>前往值object</returns>publicobjectRun(ScriptLanguagelanguage,stringmainFunctionName,object[]parameters,stringcodeBody){if(this.Language!=language)this.Language=language;returnRun(mainFunctionName,parameters,codeBody);}///<summary>///保持一切已增加到ScriptControl中的Script代码和工具///</summary>publicvoidReset(){this.msc.Reset();}///<summary>///猎取或设置剧本言语///</summary>publicScriptLanguageLanguage{get{return(ScriptLanguage)Enum.Parse(typeof(ScriptLanguage),this.msc.Language,false);}set{this.msc.Language=value.ToString();}}///<summary>///猎取或设置剧本实行工夫,单元为毫秒///</summary>publicintTimeout{get{returnthis.msc.Timeout;}set{this.msc.Timeout=value;}}///<summary>///设置是不是显现用户界面元素///</summary>publicboolAllowUI{get{returnthis.msc.AllowUI;}set{this.msc.AllowUI=value;}}///<summary>///宿主使用程序是不是有保密性请求///</summary>publicboolUseSafeSubset{get{returnthis.msc.UseSafeSubset;}set{this.msc.UseSafeSubset=true;}}///<summary>///RunError事务引发///</summary>privatevoidOnError(){if(RunError!=null)RunError();}///<summary>///OnTimeout事务引发///</summary>privatevoidOnTimeout(){if(RunTimeout!=null)RunTimeout();}privatevoidScriptEngine_Error(){OnError();}privatevoidScriptEngine_Timeout(){OnTimeout();}}}下面的包装界说了一个ScriptLanguage列举,如许操纵起来更便利一点。别的剧本引擎包含了Error事务和Timeout事务,依据实践利用情形可举行注册。二.剧本引擎演示我建了个窗体程序,测试包含剧本言语的选择,是不是开启AllowUI属性,超不时间的设置,和剧本引擎挪用办法的选择。测试程序代码对照长,上面列出了次要部分:usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Data;namespaceZZ{publicclassForm1:System.Windows.Forms.Form{privateScriptEnginescriptEngine;privateSystem.Windows.Forms.CheckBoxcheckBoxAllowUI;privateSystem.Windows.Forms.TextBoxtextBoxResult;privateSystem.Windows.Forms.NumericUpDownnumericUpDownTimeout;privateSystem.Windows.Forms.TextBoxtextBoxCodeBody;privateSystem.Windows.Forms.ButtonbuttonRun;privateSystem.Windows.Forms.ButtonbuttonCancel;privateSystem.Windows.Forms.ComboBoxcomboBoxScript;privateSystem.Windows.Forms.TextBoxtextBoxParams;privateSystem.Windows.Forms.RadioButtonradioButtonEval;privateSystem.Windows.Forms.RadioButtonradioButtonRun;privateSystem.Windows.Forms.TextBoxtextBoxMethodName;privateSystem.ComponentModel.Containercomponents=null;publicForm1(){InitializeComponent();this.comboBoxScript.SelectedIndex=0;this.scriptEngine=newScriptEngine();this.scriptEngine.UseSafeSubset=true;this.scriptEngine.RunError+=newRunErrorHandler(scriptEngine_RunError);this.scriptEngine.RunTimeout+=newRunTimeoutHandler(scriptEngine_RunTimeout);}protectedoverridevoidDispose(booldisposing){if(disposing)if(components!=null)components.Dispose();base.Dispose(disposing);}#regionWindows窗体计划器天生的代码privatevoidInitializeComponent(){//省略}#endregionstaticvoidMain(){Application.Run(newForm1());}//运转剧本privatevoidbuttonRun_Click(objectsender,System.EventArgse){this.scriptEngine.Reset();this.scriptEngine.Language=(ScriptLanguage)Enum.Parse(typeof(ScriptLanguage),this.comboBoxScript.SelectedItem.ToString());this.scriptEngine.Timeout=(int)this.numericUpDownTimeout.Value;this.scriptEngine.AllowUI=this.checkBoxAllowUI.Checked;if(this.radioButtonEval.Checked)//实行Eval办法{this.textBoxResult.Text=this.scriptEngine.Eval(this.textBoxMethodName.Text+"("+this.textBoxParams.Text+")",this.textBoxCodeBody.Text).ToString();}else//实行Run办法{string[]parameters=(string[])this.textBoxParams.Text.Split(,);object[]paramArray=newobject;for(inti=0;i<parameters.Length;i++)paramArray=Int32.Parse(parameters);this.textBoxResult.Text=this.scriptEngine.Run(this.textBoxMethodName.Text,paramArray,this.textBoxCodeBody.Text).ToString();}}//加入程序privatevoidbuttonCancel_Click(objectsender,System.EventArgse){this.Close();}//毛病函数privatevoidscriptEngine_RunError(){MessageBox.Show("RunError实行剧本毛病!");}privatevoidscriptEngine_RunTimeout(){MessageBox.Show("RunTimeout实行剧本超时,激发毛病!");}}}
上面是测试程序运转界面:
在文本框中写了一个JavaScript的函数。输出12,输入12000012。假如把超不时间调剂为1毫秒,那末实行该剧本就会跳出上面的超时提示框,同时引发事务。
总结,下面演示了JavaScript剧本,假如有乐趣读者能够写一些VBsript函数举行测试,剧本言语也只列出了三种,看了匡助,他还撑持其他一些剧本,假如必要能够增加。别的,由于是挪用Com,有些前往值是obejct范例的,必要举行转换。在CSDN的手艺论坛C#板块下经常有伴侣问这方面的成绩,关于碰着这类成绩的伴侣,但愿经由过程这篇文章能取得一些你必要的匡助,很乐意能和弄.net的伴侣举行交换,我的邮件地点zhzuocn@163.com使用cdonts,可以发送、查看邮件,实现webmail的功能。结合wsh,可以实现对nt主机的管理,如nt用户管理、iis虚拟主机设置、exchange邮箱设置等等,就像管理本地机一样方便。

再见西城 发表于 2015-1-19 22:24:18

封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。

再现理想 发表于 2015-1-25 08:42:00

如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。

仓酷云 发表于 2015-2-2 17:18:47

ASP也是这几种脚本语言中最简单易学的开发语言。但ASP也是这几种语言中唯一的一个不能很好支持跨平台的语言。  因为ASP脚本语言非常简单,因此其代码也简单易懂,结合HTML代码,可快速地完成网站的应用程序。

若天明 发表于 2015-2-8 02:30:43

最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。

灵魂腐蚀 发表于 2015-2-24 02:19:59

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

老尸 发表于 2015-3-7 10:29:35

Response:从字面上讲是“响应”,因此这个是服务端向客户端发送东西的,例如Response.Write

简单生活 发表于 2015-3-14 23:07:34

在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。

分手快乐 发表于 2015-3-21 15:00:01

ASP的语言不仅仅只是命令格式差不多,而是包含在<%%>之内的命令完全就是VB语法。虽然ASP也是做为单独的一个技术来提出的,但他就是完全继承了VB所有的功能。
页: [1]
查看完整版本: ASP编程:在C#中挪用VBScript、JavaScript等剧本...