亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

在C#中調(diào)用VBScript、JavaScript等腳本的實現(xiàn)

2024-07-21 02:27:14
字體:
供稿:網(wǎng)友

以前在做工作流(workflow)項目的時候,里面有一項就是在用戶制定流程定義時可以編寫腳本來控制活動的跳轉(zhuǎn),而這些腳本定義后存在數(shù)據(jù)庫中,當流程啟動的時候,工作流引擎會控制活動執(zhí)行順序,串型的兩個活動比較簡單,但有的活動到下一個活動有條件判斷,或者存在多個分支,簡單的還好,只要在數(shù)據(jù)庫表中加個字段就可以實現(xiàn),復雜一點的就需要通過腳本實現(xiàn)了。當時經(jīng)驗不夠,幾天都沒找到快速的解決辦法,想自己寫一個自定義腳本引擎沒有把握,而且時間也不夠,還是在網(wǎng)上找找看吧,花了一些時間,還是找到了一個自認為比較好的解決辦法,寫出來同大家分享。
下面通過兩部分來說明實現(xiàn)以及應用。


一.使用msscriptcontrol

到微軟的網(wǎng)站上下載windows script control,它是一個activex(r) 控件,所以在.net中使用我interop了一下。下載安裝完成后,新建一個c#的windows應用程序項目,在解決方案資源管理器中選中引用節(jié)點,右鍵點擊選擇添加引用菜單,彈出添加引用對話框,單擊瀏覽找到安裝windows script control的目錄,選取msscript.ocx文件確定。那么在引用節(jié)點下會增加一個msscriptcontrol組件,下面是他interop后的所有對象。



scriptcontrol 對支持 activex(tm) script 的宿主 script 引擎提供簡單接口。接下來我們對被轉(zhuǎn)化成scriptcontrolclass類的scriptcontrol的屬性和方法進行一些說明。
屬性
allowui 屬性:應用于 scriptcontrol 本身或 scirpt 引擎顯示的用戶界面元素,可讀寫。
codeobject 屬性:返回對象,該對象用于調(diào)用指定模塊的公用成員。只讀。
error 屬性:返回 error 對象,其中包含所發(fā)生的最后一個錯誤的相關(guān)詳細信息。只讀。
language 屬性:設(shè)置或返回正在使用的 script 語言名稱??勺x寫。
modules 屬性:為 scriptcontrol 對象返回模塊集合。只讀。
procedures 屬性:返回在指定模塊中定義的過程集合。只讀。
sitehwnd 屬性:設(shè)置或返回窗口的 hwnd,通過執(zhí)行 script 代碼,此窗口用于顯示對話框和其他用戶界面元素??勺x寫。
state 屬性:設(shè)置或返回 scriptcontrol 對象的模式。可讀寫。
timeout 屬性:設(shè)置或返回時間(毫秒),此時間后用戶可選擇中止 script 代碼的執(zhí)行或允許代碼繼續(xù)執(zhí)行??勺x寫。
usesafesubset 屬性:設(shè)置或返回 boolean 值,指明宿主應用程序是否有保密性要求。如果宿主應用程序需要安全控制,則 usesafesubset 為 true,否則為 false??勺x寫。
方法
addcode 方法:向模塊添加指定代碼。可多次調(diào)用 addcode 方法。
addobject 方法:使主機對象模型對 script 引擎可用。
eval 方法:計算表達式并返回結(jié)果。
executestatement 方法:執(zhí)行指定的語句。
reset 方法:放棄所有已經(jīng)添加到 scriptcontrol 中的 script 代碼和對象。
run 方法:運行指定過程。
事件
error 事件:出現(xiàn)運行時錯誤時,發(fā)生此事件。
timeout 事件:當超出了 timeout 屬性指定的時間且用戶在結(jié)果對話框中選定了 end 時,發(fā)生此事件。
補充幾點
allowui 屬性如果設(shè)置為false,則顯示對話框之類的語句不起作用,如在 vbscript 中msgbox 語句,javascript中的alert等,并且如果執(zhí)行的腳本超出timeout設(shè)置的毫秒數(shù),也不會跳出超出時間提醒的對話框,反之則相反;重新設(shè)置 language 屬性會清空addcode加載的代碼;對于timeout屬性,發(fā)生超時時,scriptcontrol 檢查對象的 allowui 屬性,確定是否允許顯示用戶界面元素。
如果讀者需要更詳細的了解,可以查看msdn文檔。
為了使控件更容易使用,我用一個scriptengine類包裝了一下,下面是完整代碼:

using system;
using msscriptcontrol;
using system.text;
namespace zz
{
    /// <summary>
     /// 腳本類型
     /// </summary>
     public enum scriptlanguage
     {
         /// <summary>
         /// jscript腳本語言
         /// </summary>
         jscript,
         /// <summary>
         /// vbscript腳本語言
         /// </summary>
         vbscript,
         /// <summary>
         /// javascript腳本語言
         /// </summary>
         javascript
     }
     /// <summary>
     /// 腳本運行錯誤代理
     /// </summary>
     public delegate void runerrorhandler();
     /// <summary>
     /// 腳本運行超時代理
     /// </summary>
     public delegate void runtimeouthandler();
     /// <summary>
     /// scriptengine類
     /// </summary>
     public class scriptengine
     {
         private scriptcontrol msc;
         //定義腳本運行錯誤事件
         public event runerrorhandler runerror;
         //定義腳本運行超時事件
         public event runtimeouthandler runtimeout;
         /// <summary>
         ///構(gòu)造函數(shù)
         /// </summary>
         public scriptengine():this(scriptlanguage.vbscript)
         {
         }
         /// <summary>
         /// 構(gòu)造函數(shù)
         /// </summary>
         /// <param name="language">腳本類型</param>
         public scriptengine(scriptlanguage language)
         {
              this.msc = new scriptcontrolclass();
              this.msc.usesafesubset = true;
              this.msc.language = language.tostring();
              ((dscriptcontrolsource_event)this.msc).error += new dscriptcontrolsource_erroreventhandler(scriptengine_error);
              ((dscriptcontrolsource_event)this.msc).timeout += new dscriptcontrolsource_timeouteventhandler(scriptengine_timeout);
         }
         /// <summary>
         /// 運行eval方法
         /// </summary>
         /// <param name="expression">表達式</param>
         /// <param name="codebody">函數(shù)體</param>
         /// <returns>返回值object</returns>
         public object eval(string expression,string codebody)
         {
              msc.addcode(codebody);
              return msc.eval(expression);
         }
         /// <summary>
         /// 運行eval方法
         /// </summary>
         /// <param name="language">腳本語言</param>
         /// <param name="expression">表達式</param>
         /// <param name="codebody">函數(shù)體</param>
         /// <returns>返回值object</returns>
         public object eval(scriptlanguage language,string expression,string codebody)
         {
              if(this.language != language)
                   this.language = language;
              return eval(expression,codebody);
         }
         /// <summary>
         /// 運行run方法
         /// </summary>
         /// <param name="mainfunctionname">入口函數(shù)名稱</param>
         /// <param name="parameters">參數(shù)</param>
         /// <param name="codebody">函數(shù)體</param>
         /// <returns>返回值object</returns>
         public object run(string mainfunctionname,object[] parameters,string codebody)
         {
              this.msc.addcode(codebody);
              return msc.run(mainfunctionname,ref parameters);
          }
         /// <summary>
         /// 運行run方法
         /// </summary>
         /// <param name="language">腳本語言</param>
         /// <param name="mainfunctionname">入口函數(shù)名稱</param>
         /// <param name="parameters">參數(shù)</param>
         /// <param name="codebody">函數(shù)體</param>
         /// <returns>返回值object</returns>
         public object run(scriptlanguage language,string mainfunctionname,object[] parameters,string codebody)
         {
              if(this.language != language)
                   this.language = language;
              return run(mainfunctionname,parameters,codebody);
         }
         /// <summary>
         /// 放棄所有已經(jīng)添加到 scriptcontrol 中的 script 代碼和對象
         /// </summary>
         public void reset()
         {
              this.msc.reset();
         }
         /// <summary>
         /// 獲取或設(shè)置腳本語言
         /// </summary>
         public scriptlanguage language
         {
              get{return (scriptlanguage)enum.parse(typeof(scriptlanguage),this.msc.language,false);}
              set{this.msc.language = value.tostring();}
         }
         /// <summary>
         /// 獲取或設(shè)置腳本執(zhí)行時間,單位為毫秒
         /// </summary>
         public int timeout
         {
              get{return this.msc.timeout;}
              set{this.msc.timeout = value;}
         }
         /// <summary>
         /// 設(shè)置是否顯示用戶界面元素
         /// </summary>
         public bool allowui
         {
              get{return this.msc.allowui;}
              set{this.msc.allowui = value;}
         }
         /// <summary>
         /// 宿主應用程序是否有保密性要求
         /// </summary>
         public bool usesafesubset
         {
              get{return this.msc.usesafesubset;}
              set{this.msc.usesafesubset = true;}
         }
         /// <summary>
         /// runerror事件激發(fā)
         /// </summary>
         private void onerror()
         {
              if(runerror!=null)
                   runerror();
         }
         /// <summary>
         /// ontimeout事件激發(fā)
         /// </summary>
         private void ontimeout()
         {
              if(runtimeout!=null)
                   runtimeout();
         }
         private void scriptengine_error()
         {
              onerror();
         }
         private void scriptengine_timeout()
         {
              ontimeout();
         }
     }
}
上面的包裝定義了一個scriptlanguage枚舉,這樣操作起來更方便一點。另外腳本引擎包括了error事件和timeout事件,根據(jù)實際使用情況可進行注冊。
 
二.腳本引擎演示
     我建了個窗體程序,測試包括腳本語言的選擇,是否開啟allowui屬性,超時時間的設(shè)置,以及腳本引擎調(diào)用方法的選擇。測試程序代碼比較長,下面列出了主要部分:
using system;
using system.drawing;
using system.collections;
using system.componentmodel;
using system.windows.forms;
using system.data;
namespace zz
{
     public class form1 : system.windows.forms.form
     {
         private scriptengine scriptengine;
         private system.windows.forms.checkbox checkboxallowui;
         private system.windows.forms.textbox textboxresult;
         private system.windows.forms.numericupdown numericupdowntimeout;
         private system.windows.forms.textbox textboxcodebody;
         private system.windows.forms.button buttonrun;
         private system.windows.forms.button buttoncancel;
         private system.windows.forms.combobox comboboxscript;
         private system.windows.forms.textbox textboxparams;
         private system.windows.forms.radiobutton radiobuttoneval;
         private system.windows.forms.radiobutton radiobuttonrun;
         private system.windows.forms.textbox textboxmethodname;
         private system.componentmodel.container components = null;
 
         public form1()
         {
              initializecomponent();
              this.comboboxscript.selectedindex = 0;
              this.scriptengine = new scriptengine();
              this.scriptengine.usesafesubset = true;
              this.scriptengine.runerror += new runerrorhandler(scriptengine_runerror);
              this.scriptengine.runtimeout += new runtimeouthandler(scriptengine_runtimeout);
         }
         protected override void dispose( bool disposing )
         {
              if( disposing )
                   if (components != null)
                       components.dispose();
              base.dispose( disposing );
         }
         #region windows 窗體設(shè)計器生成的代碼
         private void initializecomponent()
         {
              //省略
         }
         #endregion
          [stathread]
         static void main()
         {
              application.run(new form1());
         }
         //運行腳本
         private void buttonrun_click(object sender, system.eventargs e)
         {
              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)//執(zhí)行eval方法
              {
                   this.textboxresult.text = this.scriptengine.eval(this.textboxmethodname.text+"("+this.textboxparams.text+")",this.textboxcodebody.text).tostring();
              }
              else//執(zhí)行run方法
              {
                   string[] parameters = (string[])this.textboxparams.text.split(',');
                   object [] paramarray = new object[parameters.length];
                   for(int i = 0;i<parameters.length;i++)
                       paramarray[i] = int32.parse(parameters[i]);
                   this.textboxresult.text = this.scriptengine.run(this.textboxmethodname.text,paramarray,this.textboxcodebody.text).tostring();
              }
         }
         //退出程序
         private void buttoncancel_click(object sender, system.eventargs e)
         {
              this.close();
         }
         //錯誤函數(shù)
         private void scriptengine_runerror()
         {
              messagebox.show("runerror執(zhí)行腳本錯誤!");
         }
         private void scriptengine_runtimeout()
         {
              messagebox.show("runtimeout執(zhí)行腳本超時,引發(fā)錯誤!");
         }
     }
}

下面是測試程序運行界面:

在文本框中寫了一個javascript的函數(shù)。輸入12,輸出12000012。
如果把超時時間調(diào)整為1毫秒,那么執(zhí)行該腳本就會跳出下面的超時提醒框,同時激發(fā)事件。

總結(jié),上面演示了javascript腳本,如果有興趣讀者可以寫一些vbsript函數(shù)進行測試,腳本語言也只列出了三種,看了幫助,他還支持其他一些腳本,如果需要可以添加。另外,因為是調(diào)用com,有些返回值是obejct類型的,需要進行轉(zhuǎn)換。在csdn的技術(shù)論壇c#板塊下時常有朋友問這方面的問題,對于碰到這類問題的朋友,希望通過這篇文章能獲得一些你需要的幫助,很高興能和搞.net的朋友進行交流,我的郵件地址[email protected]
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
一区二区理论电影在线观看| 一区二区三区国产福利| 亚洲天堂网一区| 久久丁香综合五月国产三级网站| 99热精品在线播放| 最新eeuss影院在线观看| 一级在线免费观看| 蜜桃精品在线观看| jizzjizzjizz在线观看| 99在线免费视频| 欧美激情中文字幕在线| 国产日产欧产精品推荐色| 国产精品第10页| 日韩夫妻性生活xx| 3d欧美精品动漫xxxx无尽| 国产欧美日韩在线| 亚洲h精品动漫在线观看| 国产精品1000部啪视频| 国产极品美女到高潮| 日韩免费中文专区| 国产精品13p| 亚洲黄色激情视频| 91超碰rencao97精品| 国产午夜精品久久久久久免费视| 午夜视频www| 福利一区二区免费视频| 午夜在线观看一区| 欧美人与拘性视交免费看| 亚洲一区视频在线观看视频| 国产精品欧美激情在线| 日日夜夜一区二区| 久久国产精品99国产精| 亚洲高清毛片一区二区| 乱子伦视频在线看| 国产片在线观看| 永久免费av无码网站性色av| 一区二区高清| 夜夜摸夜夜操| 亚洲一区在线视频观看| 国产精品久久久久无码av| 国产一区二区成人| 国产精品久久久久久久久久久久久| 在线播放一区二区精品视频| 日韩高清中文字幕一区二区| 影音先锋人妻啪啪av资源网站| 6—12呦国产精品| 男人av在线| 国内成+人亚洲+欧美+综合在线| 色播在线视频| 精品盗摄女厕tp美女嘘嘘| 欧美激情视频一区二区三区免费| 亚洲成人中文字幕在线| 中文在线免费看视频| 在线观看av的网站| 欧美人与物videos| 亚洲va欧美va人人爽午夜| 亚洲黄色小视频| 欧美日本不卡| 影音先锋中文在线播放| 国产精品视频网站在线观看| 欧美精品18videosex性欧美| 中文在线天堂网| 日韩欧美在线123| 国产精品国模在线| 日韩伦人妻无码| 波多野结衣视频播放| 日韩欧美第二区在线观看| 偷拍中文亚洲欧美动漫| 欧美在线黄色| 欧美xxxx做受欧美.88| 在线观看免费视频黄| 欧美韩国理论所午夜片917电影| 欧美激情一区二区| 欧美1区2区视频| 在线看成人av| 久久香蕉一区| 香蕉视频黄色片| 日韩成人精品一区| 日韩亚洲国产精品| 精品国产一区二区三区无码| 91超碰中文字幕久久精品| 国产精品一区二区在线播放| 无码人妻aⅴ一区二区三区有奶水| 超级污的网站| 国产精品综合| 精品少妇久久久久久888优播| 成人在线免费| 洋洋成人永久网站入口| 韩日中文字幕| 婷婷在线免费视频| 日韩精品中文字幕第1页| 美洲天堂一区二卡三卡四卡视频| 国产一区二区三区在线播放免费观看| 日本综合一区二区三区| 欧美成人亚洲高清在线观看| 亚洲综合欧美在线| 亚洲综合偷拍欧美一区色| 国产成人精品免费视| 国产精品国产三级国产aⅴ浪潮| 久久综合综合久久综合| 久久精品99国产国产精| 69夜色精品国产69乱| 色老板在线视频| 免费看日本黄色| 曰本一区二区三区视频| 91精品国产色综合久久不卡98口| 久久精品国产亚洲| 99国产精品久久一区二区三区| 亚洲狠狠婷婷综合久久久久图片| 欧美变态xxxx| 在线不卡av电影| 国产一区一一区高清不卡| 香蕉视频一区二区| 欧美一级大片视频| 竹内纱里奈兽皇系列在线观看| 狠狠色丁香九九婷婷综合五月| 欧美一区二区在线视频| 久久婷婷国产精品| www.久久热| 四虎国产成人免费观看| 夜先锋av资源| 色婷婷av一区二区三区软件| 精品一区二区三区中文字幕在线| 亚洲一区欧美二区| 国产aⅴ爽av久久久久成人| 精品一区二区三区免费站| 香蕉视频污视频| 亚洲第一色网| 美女少妇一区二区| 中文字幕在线欧美| 女人18毛片九区毛片在线| 五月天久久狠狠| 亚洲一区在线免费观看| 最近2019中文字幕在线高清| 国产精品亚洲综合久久| 精品一区精品二区| 成人免费看吃奶视频网站| 男人天堂新网址| 91精品久久久久久久久久不卡| 国产精品欧美极品| 超碰成人97| 中国a一片一级一片| 91在线国产电影| 国产精品视频一二三| 久久噜噜噜精品国产亚洲综合| 99在线热播精品免费| 性高潮视频在线观看| 91丨九色丨国产在线| 一区二区在线免费观看| 亚洲aa中文字幕| 国产一区二区三区网站| 欧美日韩精品免费观看视频完整| 成人免费观看网址| 青草视频在线播放| 免费成人深夜夜行视频| 日韩久久久久久久久久久久| 日韩精品一区二区在线观看| 逼特逼视频在线| 精品电影一区二区三区| 亚洲免费观看视频| 91麻豆精品| 欧美日韩亚洲国产精品| 日韩视频在线观看一区二区三区| 国产一级大片| 青青操视频在线播放| 精品久久九九| 久久夜色精品国产欧美乱极品| 欧日韩精品视频| 国产精品一二三在线观看| 精品电影在线| 97碰碰碰免费公开在线视频| 中文字幕在线免费观看| 日韩欧美国产精品一区| 成人午夜激情网| 欧美色网一区二区| 国产精品亚洲二区在线观看| 国产区一区二区三| 久久网免费视频| 97人妻天天摸天天爽天天| 欧美亚洲日本在线| 亚洲91精品在线观看| 亚洲热app| 99久久久国产精品| 欧美日韩国产999| 国产成人综合网| 99久久久无码国产精品不卡| 国产乱码一区| 性鲍视频在线观看| 999视频精品| 日韩一级成人av| 国产精品欧美在线| 精品国产一区二区三区久久久蜜臀| 视频在线国产| jizz免费一区二区三区| 男女裸体影院高潮| 中国老太性bbbxxxx| 欧美男男大粗吊1069| 国产日本亚洲高清| 国产男女av| 欧美一级久久久| 成人免费视频网站在线观看| 色涩视频在线观看| 国产精品久久久久久久久动漫| 男人插女人下面视频| 91久久久久久久久久久久久久| 久久99精品久久| 男人的天堂免费在线视频| 成人福利资源| 欧美夫妇交换xxx| 国产精品视频一区二区久久| 美女久久99| 久久一区二区三区四区| 国产精品白丝jk喷水视频一区| 7777奇米亚洲综合久久| 欧美另类videoxo高潮| 国产网站免费在线观看| 久久青草久久| 老司机福利av| 成人羞羞国产免费图片| 中文字幕欧美色图| 欧美黑人猛交| 极品一区美女高清| 精品欧美日韩在线| av网址在线观看免费| 99国产精品免费视频| 黄色国产精品| 日韩中文字幕在线免费观看| 91精品国产91久久久久| 精品视频免费观看| 国产超碰人人爽人人做人人爱| 国产91在线播放九色| 日本三级片在线观看| 中文字幕在线观看你懂的| 精品免费国产一区二区三区四区| 成人综合电影| 91精品国产福利| 在线观看免费成人| 亚洲综合av影视| 日韩网站中文字幕| 精品久久久久久中文字幕动漫| www污污在线| 亚洲激情自拍视频| 一区二区三区波多野结衣在线观看| 国产欧美一区二区精品婷婷| 日本道中文字幕| 微拍福利一区二区| 成人有码视频在线播放| 18激情网站| 国产大学生自拍视频| 日韩激情视频一区二区| 91久色国产| 福利在线播放| 国产精品sss在线观看av| 国产精品私拍pans大尺度在线| 性猛交富婆╳xxx乱大交天津| 国产免费又粗又猛又爽| 好看的中文字幕在线播放| av影片在线| 大胆人体色综合| 亚洲乱熟女一区二区| 91丨porny丨蝌蚪视频| 欧美videossex极品| 欧美日本国产精品| 欧美国产精品专区| 中文字幕亚洲一区| 日韩欧美精品一区二区三区| 日韩视频中文字幕| 成人免费视频观看| 香蕉久久夜色精品国产使用方法| 性感美女一级片| 在线成人性视频| 蜜桃av在线免费观看| 日韩精品第二页| 国产成人午夜高潮毛片| 成 人片 黄 色 大 片| 亚洲国产精品久久久久婷蜜芽| 第四色中文综合网| 国产精品jk白丝蜜臀av小说| 亚洲色图88| 国内精品小视频| 国产 日韩 欧美 精品| 99久久久无码国产精品| 成人网在线免费看| 国产一区二区女| 欧美激情专区| 亚洲精品国产一区二区三区四区在线| 在线观看免费视频一区二区三区| 亚洲少妇诱惑| 丰满白嫩尤物一区二区| 国产精品欧美激情在线| 最新精品国偷自产在线| 欧美日产一区二区三区在线观看| 亚洲精品毛片一区二区三区| 日韩精品无码一区二区三区久久久| 亚洲最新在线| 97国产一区二区精品久久呦| 欧美久久精品午夜青青大伊人| 精品久久网站| 嫩呦国产一区二区三区av| 亚洲国产高清aⅴ视频| 午夜视频免费在线| 91专区在线观看| 久草视频在线观| 日本一级黄视频| 99热国内精品永久免费观看| 国产8mav视频| 91视频亚洲| 国产麻豆成人传媒免费观看| 欧美一区二区三区视频| 精品国产美女福利到在线不卡| 九九久久精品| 北条麻妃视频在线| 97久久人人超碰| 无码国产69精品久久久久同性| 久热精品视频在线| 日韩亚洲精品电影| av手机天堂网| 福利精品一区| 免费观看性欧美大片无片| 中文字幕日韩一区二区不卡| 国产老妇伦国产熟女老妇视频| 国产精品怡红院| 黄色资源在线看| 91久久久久久久久久久久| avtt天堂资源网站| 97dyy97影院理论片在线| free性欧美69巨大| 久久亚洲国产成人亚|