日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)

發(fā)布時間:2025/4/16 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ScriptControl接口

?

屬性名稱 類型 備注
AllowUI BOOL 檢測是否允許運行用戶的接口元素。如果為False,則諸如消息框之類的界面元素不可見。
CodeObject Object 腳本暴露給宿主調(diào)用的對象。只讀。
Modules Modules 宿主提供給腳本的組件庫模塊。只讀。(COM組件通常都是以對象收集的形式向用戶提供可以留給用戶二次開發(fā)的對象集合,每一個收集即一個Modules)
Language String 設置或獲取腳本引擎解釋的語言,例如:VBScript、JScript。
Name String 腳本引擎的名稱。只讀。
Procedures Procedures 返回模塊中定義的過程的集合
SitehWnd HWND 在腳本中顯示UI的父窗口句柄
State Enum 設置或返回控件的狀態(tài),如果為0,控件只執(zhí)行語句但不轉(zhuǎn)發(fā)事件,為1則為加入的本控件接受的對象轉(zhuǎn)發(fā)事件。
Timeout Long 控件的執(zhí)行腳本的超時值,-1表示不超時
UseSafeSubset BOOL 設置或返回宿主程序是否關心安全。宿主程序的安全級別可以從此屬性設置
Error Error 錯誤對象,發(fā)生錯誤時,此屬性返回一個錯誤對象

?

?

方法名稱 參數(shù) 功能
AddCode Code As String 往腳本引擎中加入要執(zhí)行的腳本
AddObject Name As String, Object As Object, [AddMembers As Boolean = False] 往腳本引擎加入一個對象,以便在腳本中可以使用該對象提供的方法等。
Eval Expression As String 表達式求值
ExecuteStatement Statement As String 解釋并執(zhí)行腳本語句
Reset 丟棄所有的對象和代碼,將State屬性置0。
Run ProcedureName As String, ParamArray Parameters() As Variant 運行一個指定的過程

?

?

事件名稱 功能
Error 有錯誤發(fā)生時激發(fā)該事件
TimeOut 執(zhí)行過程超時時發(fā)生

?

一般使用方法 1、在程序中加入ScriptControl 2、定義一個ScriptControl的實例 3、調(diào)用AddCode等方法向腳本引擎中加入要執(zhí)行的腳本。 4、調(diào)用Run執(zhí)行要執(zhí)行的腳本函數(shù)。 宿主與腳本的通訊 1、?宿主調(diào)用腳本:這個過程比較簡單,只要調(diào)用Run就可以將參數(shù)傳遞到腳本。 2、?腳本調(diào)用宿主:在初始化過程中調(diào)用AddObject接口,將宿主的一個或多個對象暴露給腳本,這時就可以在腳本中調(diào)用宿主對象的方法。在VC++中這個對象不是普通的C++類,它必須支持自動化,在腳本中也只能調(diào)用對象中自動化接口(在VB中這個個程相對比較簡單)。 腳本調(diào)試 任何人寫的代碼都不可能一次就很完美,但是腳本由于執(zhí)行的位置特殊,調(diào)試方法也不一樣。首先下載一個腳本調(diào)試器(我用的是Microsoft Script Debugger, 在MS網(wǎng)站有下載,另據(jù)說其它的如VJ++也可以),安裝以后在菜單上沒有啟動菜單。 調(diào)試器的啟動 在一般的高級語言中都可以方便的設置斷點,但是在啟動腳本調(diào)試器以前如何開始調(diào)試呢?在IE中腳本出錯會自動提示是否調(diào)試,還可以在腳本中加入中斷代碼(VBScript: Stop JavaScript: debugger),但是在ScriptControl還需要修改一下注冊表才可以,你需要將HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings下的JITDebug的值改為1(默認為0)

以下是C#引用的完整代碼示例:

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) }

?

轉(zhuǎn)載于:https://www.cnblogs.com/coolsundy/p/7116123.html

總結(jié)

以上是生活随笔為你收集整理的MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。