在C#中调用VBScript、javascript等脚本的实现代码

一.使用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

(0)

相关推荐

  • asp.net 验证码的简单制作(vb.net+C#)

    网站上验证码效果一般制作方法是: 1)使用HttpHandler(一般处理程序)绘制随机验证码的图,以及产生随机码,并输出到页面的OutputStream中. 2)页面中使用异步方式(js等)进行刷新当前页面的验证码. [示例] 1)创建一个"一般应用处理程序ashx",代码如下: [C#] 复制代码 代码如下: public class ValidationCode : IHttpHandler { //随机发生器 static Random r = new Random(Guid.

  • 如何让C#、VB.NET实现复杂的二进制操作

    相应的类库可在我的资源页面中找到,关于类成员的说明可通过对象浏览器查看函数说明 复制代码 代码如下: Imports BitOperatorLibrary.ShiftOperation.CircularShiftOperationImports BitOperatorLibrary.ShiftOperation.NormalShiftOperationImports BitOperatorLibrary.bitConvert Module Module1 Sub Main()        Co

  • asp.net 程序性能优化的七个方面 (c#(或vb.net)程序改进)

    1.使用值类型的ToString方法 在连接字符串时,经常使用"+"号直接将数字添加到字符串中.这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中.但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中. 使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能. int num=1; string str="go"+num.T

  • C#利用ScriptControl动态执行JS和VBS脚本

    ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object 脚本暴露给宿主调用的对象.只读. Modules Modules 宿主提供给脚本的组件库模块.只读.(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules) Language String 设置或获取脚本引擎解释的语言,例如:VBScript.

  • C#、vb.net及SQL判断指定年份是否为闰年的方法

    本文实例讲述了本文章介绍了在c#,vb.net,sql中来判断指定日期是否为闰年的方法.分享给大家供大家参考.具体实现方法如下: C#代码如下: 复制代码 代码如下: public bool IsLeapYear(int year) {         if ((year < 1) || (year > 9999))         {             throw new ArgumentOutOfRangeException("year", "年份必须是

  • C#中调用VB中Inputbox类的实现方法

    C#自己没有Inputbox这个类,但是Inputbox也蛮好用的,所以有两种方法可以使用 一:间接调用vb中的Inputbox功能 1.在项目中添加对Microsoft.VisualBasic引用       2.在项目中添加命名空间Using Microsoft.VisualBasic;       3.以后就可以直接使用VB中的好多类库(爽啊--) 例如:textBox1.Text=Microsoft.VisualBasic.Interaction.InputBox("提示性文字"

  • C# VB 实现10进制 16进制之间互相转换

    方法1: 复制代码 代码如下: int d=10; d.ToString("x") //或把x改为X,,,就变成了16位的字符串了. int x=Convert.ToInt32(d.ToString("x"),16);//把16进制的字符串变回10进制的. 方法2: 复制代码 代码如下: static void Main() { int i = 446; string hex = i.ToString( "X" /* or x * ); Cons

  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

    从 <<Windows Forms 2.0 Programming, 2nd Edition>>   -  Single-Instance Applications 这一章中, 学到了调用 VB.Net 中的 IsSingleInstance, 为 C# WinForm 添加只运行应用程序的单个实例 ( Single Instance Application). 是个好方法! 该方法显然从易用性上便捷与 Mutex 和 Process 这两种只运行单个应用程序实例的方法. Sing

  • javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同

    1.<script language="javascript"> var str = "ajfhslajd and"; //在此我想将字母a替换成字母A alert(str.replace("a","A")); </script> 结果:是只有替换了字符串的首字符a 这不是我要的结果 看↓ 2.replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换! <scri

  • ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页

    最近因项目需要用ACCESS做数据库开发WEB项目 看论坛上还许多人问及ACCESS被注入的安全问题 许多人解决的方法仍然是用Replace替换特殊字符,然而这样做也并没有起到太大做用 今天我就把我用ACCESS参数化查询的一些方法和经验和大家分享 希望对大家有所启发,有写的不对的地方希望高手们多多指教 ASP.NET 用OleDbCommand的new OleDbParameter创建参数货查询 ASP用Command的CreateParameter 方法创建参数化查询 (SQL储存过程查询也

  • C#调用VB进行简繁转换的方法

    本文实例讲述了C#调用VB进行简繁转换的方法.分享给大家供大家参考.具体分析如下: 首先在C#项目中引用Microsoft.VisualBasic.dll,版本自己选择合适的 然后在项目中添加引用:using Microsoft.VisualBasic; 转换: 转为繁体: outputText=Strings.StrConv(txt待转换文本, VbStrConv.TraditionalChinese); 转为简体: outputText=Strings.StrConv(txt待转换文本, V

  • C#中的除法运算符与VB.NET中的除法运算符

    VB.NET中的除法运算符有两个:/(浮点除法).\(整数除法) C#中的除法运算符只有一个:/(除法) VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分. 关于VB.NET中的除法运算符的介绍(摘自MSDN): /(浮点除法):将两个数相除并返回以浮点数表示的结果. 所得结果的数据类型取决于操作数的类型. 下表显示如何确定结果的数据类型. 操作数数据类型 结果数据类型 两个表达式都是整数数据类型(SByte.Byte.Short.UShort.Integer.UIn

  • 获取客户端IP地址c#/vb.net各自实现代码

    公司的域环境内,程序要求获取客户端的IP地址,分部程序码分享于此. C#: VB.NET:

随机推荐