到微软的网站上下载Windows Script Control,它是一个ActiveX(R) 控件,所以在.NET中使用我Interop了一下。下载安装完成后,新建一个C#的Windows应用程序项目,在解决方案资源管理器中选中引用节点,右键点击选择添加引用菜单,弹出添加引用对话框,单击浏览找到安装Windows Script Control的目录,选取msscript.ocx文件确定。
那么在引用节点下会增加一个
MSScriptControl
组件,下面是他
Interop
后的所有对象。
ScriptControl 对支持 ActiveX(TM) Script 的宿主 Script 引擎提供简单接口。接下来我们对被转化成ScriptControlClass类的ScriptControl的属性和方法进行一些说明。
属性
方法
事件
说明:
AllowUI 属性如果设置为 False,则显示对话框之类的语句不起作用,如在 VBScript 中 MsgBox 语句,JavaScript中的 alert等,并且如果执行的脚本超出 TimeOut设置的毫秒数,也不会跳出超出时间提醒的对话框,反之则相反;重新设 置 Language 属性会清空 AddCode加载的代码;对于 TimeOut属性,发生超时时,ScriptControl 检查对象的 AllowUI 属性,确定是否允许显示用户界面元素。 为了使控件更容易使用,用ScriptEngine类封装一下,下面是完整代码:
属性 | 描述 |
---|---|
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();
}
}
}
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();
}
}
}
转载于:https://www.cnblogs.com/sofire/archive/2010/08/20/1804347.html