在C#中调用VBScript、javascript等脚本的实现代码
程序员文章站
2022-10-14 22:23:07
一.使用msscriptcontrol 到微软的网站上下载windows script control,它是一个activex(r) 控件,所以在.net中使用我inter...
一.使用msscriptcontrol
到微软的网站上下载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 属性,确定是否允许显示用户界面元素。
如果读者需要更详细的了解,可以查看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>
///构造函数
/// </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(scriptengine_error);
((dscriptcontrolsource_event)this.msc).timeout += new dscriptcontrolsource_timeouteventhandler(scriptengine_timeout);
}
/// <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 para
到微软的网站上下载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 属性,确定是否允许显示用户界面元素。
如果读者需要更详细的了解,可以查看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>
///构造函数
/// </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(scriptengine_error);
((dscriptcontrolsource_event)this.msc).timeout += new dscriptcontrolsource_timeouteventhandler(scriptengine_timeout);
}
/// <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 para