在C#中调用VBScript等脚本的实现(上)
下面通过两部分来说明实现以及应用。
一.使用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 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();
()
- · 轻松弹出无边框网页的Javscrpt代码
- · ASP初学者参考
- · Java新手学习:IIS6和Tomcat5的整合
- · asp常用函数
- · W3 Jmail中文使用说明
- · 无组件上传图片到数据库中,最完整解决方案
- · 二级域名原理以及程序,申请即可开通
- · Java学习过程的一些重点
- · Oracle9i中如何建立不同字符集的数据库
- · 修复SQL Server 2000数据库之实战经验
- · 使用ASP生成HTML文件
- · 编写安全的ASP代码
- · 十天学会ASP.net(2)
- · 十天学会ASP.net(1)
- · 十天学会php(2)
- · 十天学会php(1)
- · 三天学好ADO
- · 在数据库中存取文件
- · 解决大字段在Form中Post出错的方法
- · 利用ASP+JMAIL进行邮件群发的新思路
- · 关于处理GET方式提交的含有特殊字符的参数
- · 关于Adodb.Stream 的使用说明
- · 多文件多文本框上传程序
- · 让妙客家标准版使用 SQL Server 数据库后台
- · 关于用SQL SERVER2000建立分布式网站系统的认识
- · 使用SQLSERVER的扩展存储过程实现远程备份与恢复
- · MySQL数据库类的定义
- · SQL语句导入导出大全
- · SQL Server的用户及权限
- · 深入理解C语言指针的奥秘
- · VC快捷键大全
- · 简体中文编码对应器
- · WEB打印大全
- · 用ASP实现远程批量文件改名
- · 想深入学习SQL injection的人这个可要好好看看
- · 用PHP创建PDF中文文档
- · PHP生成带有雪花背景的验证码
- · 用PHP和MySQL保存和输出图片
