在C#中調(diào)用VBScript、javascript等腳本的實(shí)現(xiàn)代碼
更新時(shí)間:2009年11月30日 19:51:12 作者:
在C#中調(diào)用VBScript、javascript等腳本的實(shí)現(xiàn)步驟,需要的朋友可以參考下。
一.使用MSScriptControl
到微軟的網(wǎng)站上下載Windows Script Control,它是一個(gè)ActiveX(R) 控件,所以在.NET中使用我Interop了一下。下載安裝完成后,新建一個(gè)C#的Windows應(yīng)用程序項(xiàng)目,在解決方案資源管理器中選中引用節(jié)點(diǎn),右鍵點(diǎn)擊選擇添加引用菜單,彈出添加引用對話框,單擊瀏覽找到安裝Windows Script Control的目錄,選取msscript.ocx文件確定。那么在引用節(jié)點(diǎn)下會增加一個(gè)MSScriptControl組件,下面是他Interop后的所有對象。
ScriptControl 對支持 ActiveX(TM) Script 的宿主 Script 引擎提供簡單接口。接下來我們對被轉(zhuǎn)化成ScriptControlClass類的ScriptControl的屬性和方法進(jìn)行一些說明。
屬性
AllowUI 屬性:應(yīng)用于 ScriptControl 本身或 Scirpt 引擎顯示的用戶界面元素,可讀寫。
CodeObject 屬性:返回對象,該對象用于調(diào)用指定模塊的公用成員。只讀。
Error 屬性:返回 Error 對象,其中包含所發(fā)生的最后一個(gè)錯(cuò)誤的相關(guān)詳細(xì)信息。只讀。
Language 屬性:設(shè)置或返回正在使用的 Script 語言名稱。可讀寫。
Modules 屬性:為 ScriptControl 對象返回模塊集合。只讀。
Procedures 屬性:返回在指定模塊中定義的過程集合。只讀。
SitehWnd 屬性:設(shè)置或返回窗口的 hWnd,通過執(zhí)行 Script 代碼,此窗口用于顯示對話框和其他用戶界面元素??勺x寫。
State 屬性:設(shè)置或返回 ScriptControl 對象的模式??勺x寫。
Timeout 屬性:設(shè)置或返回時(shí)間(毫秒),此時(shí)間后用戶可選擇中止 Script 代碼的執(zhí)行或允許代碼繼續(xù)執(zhí)行??勺x寫。
UseSafeSubset 屬性:設(shè)置或返回 Boolean 值,指明宿主應(yīng)用程序是否有保密性要求。如果宿主應(yīng)用程序需要安全控制,則 UseSafeSubset 為 True,否則為 False??勺x寫。
方法
AddCode 方法:向模塊添加指定代碼??啥啻握{(diào)用 AddCode 方法。
AddObject 方法:使主機(jī)對象模型對 Script 引擎可用。
Eval 方法:計(jì)算表達(dá)式并返回結(jié)果。
ExecuteStatement 方法:執(zhí)行指定的語句。
Reset 方法:放棄所有已經(jīng)添加到 ScriptControl 中的 Script 代碼和對象。
Run 方法:運(yùn)行指定過程。
事件
Error 事件:出現(xiàn)運(yùn)行時(shí)錯(cuò)誤時(shí),發(fā)生此事件。
Timeout 事件:當(dāng)超出了 Timeout 屬性指定的時(shí)間且用戶在結(jié)果對話框中選定了 End 時(shí),發(fā)生此事件。
補(bǔ)充幾點(diǎn)
AllowUI 屬性如果設(shè)置為false,則顯示對話框之類的語句不起作用,如在 VBScript 中MsgBox 語句,javascript中的alert等,并且如果執(zhí)行的腳本超出TimeOut設(shè)置的毫秒數(shù),也不會跳出超出時(shí)間提醒的對話框,反之則相反;重新設(shè)置 Language 屬性會清空AddCode加載的代碼;對于TimeOut屬性,發(fā)生超時(shí)時(shí),ScriptControl 檢查對象的 AllowUI 屬性,確定是否允許顯示用戶界面元素。
如果讀者需要更詳細(xì)的了解,可以查看MSDN文檔。
為了使控件更容易使用,我用一個(gè)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>
/// 腳本運(yùn)行錯(cuò)誤代理
/// </summary>
public delegate void RunErrorHandler();
/// <summary>
/// 腳本運(yùn)行超時(shí)代理
/// </summary>
public delegate void RunTimeoutHandler();
/// <summary>
/// ScriptEngine類
/// </summary>
public class ScriptEngine
{
private ScriptControl msc;
//定義腳本運(yùn)行錯(cuò)誤事件
public event RunErrorHandler RunError;
//定義腳本運(yùn)行超時(shí)事件
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>
/// 運(yùn)行Eval方法
/// </summary>
/// <param name="expression">表達(dá)式</param>
/// <param name="codeBody">函數(shù)體</param>
/// <returns>返回值object</returns>
public object Eval(string expression,string codeBody)
{
msc.AddCode(codeBody);
return msc.Eval(expression);
}
/// <summary>
/// 運(yùn)行Eval方法
/// </summary>
/// <param name="language">腳本語言</param>
/// <param name="expression">表達(dá)式</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>
/// 運(yùn)行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 para
到微軟的網(wǎng)站上下載Windows Script Control,它是一個(gè)ActiveX(R) 控件,所以在.NET中使用我Interop了一下。下載安裝完成后,新建一個(gè)C#的Windows應(yīng)用程序項(xiàng)目,在解決方案資源管理器中選中引用節(jié)點(diǎn),右鍵點(diǎn)擊選擇添加引用菜單,彈出添加引用對話框,單擊瀏覽找到安裝Windows Script Control的目錄,選取msscript.ocx文件確定。那么在引用節(jié)點(diǎn)下會增加一個(gè)MSScriptControl組件,下面是他Interop后的所有對象。
ScriptControl 對支持 ActiveX(TM) Script 的宿主 Script 引擎提供簡單接口。接下來我們對被轉(zhuǎn)化成ScriptControlClass類的ScriptControl的屬性和方法進(jìn)行一些說明。
屬性
AllowUI 屬性:應(yīng)用于 ScriptControl 本身或 Scirpt 引擎顯示的用戶界面元素,可讀寫。
CodeObject 屬性:返回對象,該對象用于調(diào)用指定模塊的公用成員。只讀。
Error 屬性:返回 Error 對象,其中包含所發(fā)生的最后一個(gè)錯(cuò)誤的相關(guān)詳細(xì)信息。只讀。
Language 屬性:設(shè)置或返回正在使用的 Script 語言名稱。可讀寫。
Modules 屬性:為 ScriptControl 對象返回模塊集合。只讀。
Procedures 屬性:返回在指定模塊中定義的過程集合。只讀。
SitehWnd 屬性:設(shè)置或返回窗口的 hWnd,通過執(zhí)行 Script 代碼,此窗口用于顯示對話框和其他用戶界面元素??勺x寫。
State 屬性:設(shè)置或返回 ScriptControl 對象的模式??勺x寫。
Timeout 屬性:設(shè)置或返回時(shí)間(毫秒),此時(shí)間后用戶可選擇中止 Script 代碼的執(zhí)行或允許代碼繼續(xù)執(zhí)行??勺x寫。
UseSafeSubset 屬性:設(shè)置或返回 Boolean 值,指明宿主應(yīng)用程序是否有保密性要求。如果宿主應(yīng)用程序需要安全控制,則 UseSafeSubset 為 True,否則為 False??勺x寫。
方法
AddCode 方法:向模塊添加指定代碼??啥啻握{(diào)用 AddCode 方法。
AddObject 方法:使主機(jī)對象模型對 Script 引擎可用。
Eval 方法:計(jì)算表達(dá)式并返回結(jié)果。
ExecuteStatement 方法:執(zhí)行指定的語句。
Reset 方法:放棄所有已經(jīng)添加到 ScriptControl 中的 Script 代碼和對象。
Run 方法:運(yùn)行指定過程。
事件
Error 事件:出現(xiàn)運(yùn)行時(shí)錯(cuò)誤時(shí),發(fā)生此事件。
Timeout 事件:當(dāng)超出了 Timeout 屬性指定的時(shí)間且用戶在結(jié)果對話框中選定了 End 時(shí),發(fā)生此事件。
補(bǔ)充幾點(diǎn)
AllowUI 屬性如果設(shè)置為false,則顯示對話框之類的語句不起作用,如在 VBScript 中MsgBox 語句,javascript中的alert等,并且如果執(zhí)行的腳本超出TimeOut設(shè)置的毫秒數(shù),也不會跳出超出時(shí)間提醒的對話框,反之則相反;重新設(shè)置 Language 屬性會清空AddCode加載的代碼;對于TimeOut屬性,發(fā)生超時(shí)時(shí),ScriptControl 檢查對象的 AllowUI 屬性,確定是否允許顯示用戶界面元素。
如果讀者需要更詳細(xì)的了解,可以查看MSDN文檔。
為了使控件更容易使用,我用一個(gè)ScriptEngine類包裝了一下,下面是完整代碼:
復(fù)制代碼 代碼如下:
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>
/// 腳本運(yùn)行錯(cuò)誤代理
/// </summary>
public delegate void RunErrorHandler();
/// <summary>
/// 腳本運(yùn)行超時(shí)代理
/// </summary>
public delegate void RunTimeoutHandler();
/// <summary>
/// ScriptEngine類
/// </summary>
public class ScriptEngine
{
private ScriptControl msc;
//定義腳本運(yùn)行錯(cuò)誤事件
public event RunErrorHandler RunError;
//定義腳本運(yùn)行超時(shí)事件
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>
/// 運(yùn)行Eval方法
/// </summary>
/// <param name="expression">表達(dá)式</param>
/// <param name="codeBody">函數(shù)體</param>
/// <returns>返回值object</returns>
public object Eval(string expression,string codeBody)
{
msc.AddCode(codeBody);
return msc.Eval(expression);
}
/// <summary>
/// 運(yùn)行Eval方法
/// </summary>
/// <param name="language">腳本語言</param>
/// <param name="expression">表達(dá)式</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>
/// 運(yùn)行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 para
您可能感興趣的文章:
- 利用FlubuCore用C#來寫DevOps腳本的方法詳解
- C#調(diào)用python腳本的方法步驟(2種)
- 在VS2017中用C#調(diào)用python腳本的實(shí)現(xiàn)
- 微信跳一跳自動(dòng)腳本C#代碼實(shí)現(xiàn)
- 使用C# 的webBrowser寫模擬器時(shí)的javascript腳本調(diào)用問題
- C#調(diào)用Python腳本的簡單示例
- 總結(jié)ASP.NET C#中經(jīng)常用到的13個(gè)JS腳本代碼
- C#創(chuàng)建數(shù)據(jù)庫及導(dǎo)入sql腳本的方法
- C#利用ScriptControl動(dòng)態(tài)執(zhí)行JS和VBS腳本
- 常用工具之 vb轉(zhuǎn)化C# 數(shù)據(jù)連接串 正則表達(dá)式查詢 源碼世界 腳本字典
- C# 腳本引擎CS-Script的使用
相關(guān)文章
Unity之跑馬燈抽獎(jiǎng)效果單抽與連抽(附demo)
這篇文章主要介紹了Unity之跑馬燈抽獎(jiǎng)效果單抽與連抽,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換
這篇文章主要介紹了Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換的示例代碼,幫助大家更好的理解和使用winform開發(fā),感興趣的朋友可以了解下2020-12-12Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存)
這篇文章主要介紹了Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存) ,需要的朋友可以參考下2015-11-11C#實(shí)現(xiàn)12306自動(dòng)登錄的方法
本文介紹了C#實(shí)現(xiàn)12306自動(dòng)登錄的方法,主要方法是捕獲參數(shù)和url并補(bǔ)充參數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-07-07C#基礎(chǔ)知識之GetType與typeof的區(qū)別小結(jié)
在比較對象時(shí),需要了解他們的類型,才能決定他們的值是否能比較。所有的類都從System.Object中繼承了GetType()方法,常常與typeo()運(yùn)算符一起使用。這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)知識之GetType與typeof區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-06-06