(微软脚本引擎)C#利用msscript.ocx控件执行JS脚本

(微软脚本引擎)C#利用msscript.ocx控件执行JS脚本

到微软的网站上下载Windows Script Control,它是一个ActiveX(R) 控件,所以在.NET中使用我Interop了一下。下载安装完成后,新建一个C#的Windows应用程序项目,在解决方案资源管理器中选中引用节点,右键点击选择添加引用菜单,弹出添加引用对话框,单击浏览找到安装Windows Script Control的目录,选取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 属性,确定是否允许显示用户界面元素。

 

为了使控件更容易使用,用ScriptEngine类封装一下,下面是完整代码:
代码
复制代码
using System;
using MSScriptControl;
using System.Text;
namespace LCS.Web
{

   /// <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;
        /// <summary>
        /// 定义脚本运行错误事件
        /// </summary>
        public event RunErrorHandler RunError;
        /// <summary>
        /// 定义脚本运行超时事件
        /// </summary>
        public event RunTimeoutHandler RunTimeout;

       /// <summary>
        ///构造函数 默认为 VBscript 脚本类型
        /// </summary>
        public ScriptEngine()
            : this(ScriptLanguage.VBscript)
        { }
        /// <summary>
        /// 构造函数
        /// </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(OnError);
            ((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(OnTimeout);
        }

       /// <summary>
        /// 运行Eval方法
        /// </summary>
        /// <param name="expression">表达式</param>
        /// <param name="codeBody">函数体</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">函数体</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">入口函数名称</param>
        /// <param name="parameters">参数</param>
        /// <param name="codeBody">函数体</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">入口函数名称</param>
        /// <param name="parameters">参数</param>
        /// <param name="codeBody">函数体</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>
        /// 放弃所有已经添加到 ScriptControl 中的 Script 代码和对象
        /// </summary>
        public void Reset()
        {
            this.msc.Reset();
        }
        /// <summary>
        /// 获取或设置脚本语言
        /// </summary>
        public ScriptLanguage Language
        {
            get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
            set { this.msc.Language = value.ToString(); }
        }

       /// <summary>
        /// 获取或设置脚本执行时间,单位为毫秒
        /// </summary>
        public int Timeout
        {
            get { return 0; }
        }

       /// <summary>
        /// 设置是否显示用户界面元素
        /// </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事件激发
        /// </summary>
        private void OnError()
        {
            if (RunError != null)
                RunError();
        }

       /// <summary>
        /// OnTimeout事件激发
        /// </summary>
        private void OnTimeout()
        {
            if (RunTimeout != null)
                RunTimeout();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
详见http://bbs.csdn.net/topics/390381933 另外里面有几个控件可能也用得着,你懂的。 驱动器 C 中的卷没有标签。 .\MSSCRIPT\VBE600CHS1\script 的目录 2013/08/19 11:03 <DIR> . 2013/08/19 11:03 <DIR> .. 1998/08/05 04:12 <DIR> CHINESE 1998/07/29 18:59 109,969 DISPEX.DLL 1998/07/29 18:59 1,209,970 JSCRIPT.DLL 1997/05/24 17:16 2,154 MSSCRIPT.CNT 1997/05/24 17:16 70,780 MSSCRIPT.HLP 1998/05/01 08:39 133,392 MSSCRIPT.OCX 1998/05/13 06:53 576 README.TXT 1998/07/29 18:59 989,779 VBSCRIPT.DLL 7 个文件 2,516,620 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1998/08/05 04:12 <DIR> CONTROLS 1998/08/05 04:12 <DIR> CRYSREPT 1998/08/05 04:12 <DIR> MSAGENT 2013/08/19 11:03 <DIR> SCRIPT 2013/08/19 11:14 <DIR> WINLESS 0 个文件 0 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\CONTROLS 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1997/03/19 11:40 28,160 DBGRDCHS.DLL 1997/03/19 11:40 86,016 MSCHTCHS.DLL 2 个文件 114,176 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\CRYSREPT 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1997/03/18 19:40 21,504 CC245CHS.DLL 1 个文件 21,504 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\MSAGENT 的目录 1998/08/05 04:12 <DIR> . 1998/08/05 04:12 <DIR> .. 1998/02/25 03:10 328,336 MSAGENT.CHS.EXE 1 个文件 328,336 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\SCRIPT 的目录 2013/08/19 11:03 <DIR> . 2013/08/19 11:03 <DIR> .. 1998/06/15 04:46 18,104 JSCHS.DLL 1998/05/01 08:38 13,584 MSSCRCHS.DLL 1994/04/04 03:23 2,420 MSSCRIPT.CNT 1994/04/04 03:34 239,528 MSSCRIPT.HLP 1998/06/15 04:46 14,632 VBSCHS.DLL 5 个文件 288,268 字节 .\MSSCRIPT\VBE600CHS1\script\CHINESE\WINLESS 的目录 2013/08/19 11:14 <DIR> . 2013/08/19 11:14 <DIR> .. 1998/06/18 00:39 13,690 LTWTCT98.CHI 1998/06/18 00:39 19,382 LTWTCT98.CHM 2013/08/19 11:14 24,427 LTWTCT98.chw 1998/07/08 11:00 32,768 MSWLSCHS.DLL 4 个文件 90,267 字节 所列文件总数: 20 个文件 3,359,171 字节 20 个目录 984,694,784 可用字节

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值