c#中执行脚本语言(vbscript)

1.参考来自链接 https://www.xuebuyuan.com/513011.html 与 https://bbs.csdn.net/topics/380229790

这个库文件Interop.MSScriptControl.dll我硬是在我的电脑中没找到,网络上也搜索了,有下载链接,但还是没下载,

有知道出处的可以给我留个言,了解下.

2.后参照了这两个链接 https://blog.csdn.net/DXCyber409/article/details/79976104与https://blog.csdn.net/blacksource/article/details/17265607 在项目中添加引用了MSScript.ocx.

具体添加引用方式,【项目】->【添加引用】->【COM】->选择Microsoft Script Control 1.0组件

c#中执行脚本语言(vbscript)_第1张图片

3.确定后就添加引用完成了,下面就可以进行编写执行脚本代码例子了,我这里仅编写了vbscript的例子,javascript的例子请自行     参考下面代码进行编写.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MSScriptControl;//这里添加引用MSScript.ocx成功后,就可以using了

namespace Execute_script
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //调用库函数(ExecuteStatement)
        private void button1_Click(object sender, EventArgs e)
        {
            ScriptControl msc = new ScriptControl();
            msc.Language = "VBScript";
            msc.ExecuteStatement("msgbox \"hello world\"");
        }

        //执行表达式(Eval)
        private void button2_Click(object sender, EventArgs e)
        {
            ScriptControl msc = new ScriptControl();
            msc.Language = "VBScript";
            object l_obj = msc.Eval("1 + 2");
            MessageBox.Show(l_obj.ToString()); 
        }

        //调用自定义方法sub(method_1,无参数)
        private void button3_Click(object sender, EventArgs e)
        {
            ScriptControl msc = new ScriptControl();
            msc.Language = "VBScript";
            StringBuilder l_str = new StringBuilder();

            l_str.Append("sub method_1()");
            l_str.AppendLine("\r\n");
            l_str.Append("MsgBox \"call method_1\",vbInformation, \"method_1\" ");
            l_str.AppendLine("\r\n");
            l_str.Append("end sub");
            msc.AddCode(l_str.ToString());

            object[] l_args = new object[0];
            msc.Run("method_1", l_args);
        }

        //调用自定义方法sub(method_1,有参数)
        private void button4_Click(object sender, EventArgs e)
        {
            ScriptControl msc = new ScriptControl();
            msc.Language = "VBScript";
            StringBuilder l_str = new StringBuilder();

            l_str.Append("sub method_1(var1, var2)");
            l_str.AppendLine("\r\n");
            l_str.Append("MsgBox \"call method_1, parameter var1 = \" & var1 & \", parameter var2 = \" & var2,vbInformation, \"method_1\"");
            l_str.AppendLine("\r\n");
            l_str.Append("end sub");
            msc.AddCode(l_str.ToString());

            object[] l_args = new object[2];
            l_args[0] = "01";
            l_args[1] = "02";
            msc.Run("method_1", l_args);
        }

        //调用自定义函数function(func_1,有参数)
        private void button5_Click(object sender, EventArgs e)
        {
            ScriptControl msc = new ScriptControl();
            msc.Language = "VBScript";
            StringBuilder l_str = new StringBuilder();

            l_str.Append("function func_1(var1, var2)");
            l_str.AppendLine("\r\n");
            l_str.Append("MsgBox \"call func_1, parameter var1 = \" & var1 & \", parameter var2 = \" & var2,vbInformation, \"func_1\"");
            l_str.AppendLine("\r\n");
            l_str.Append("func_1 = var1 + var2");
            l_str.AppendLine("\r\n");
            l_str.Append("end function");
            msc.AddCode(l_str.ToString());

            object[] l_args = new object[2];
            l_args[0] = 1;
            l_args[1] = 2;
            object l_obj = msc.Run("func_1", l_args);
            MessageBox.Show(l_obj.ToString());
        }

        //调用自定义函数function(func_1,无参数)
        private void button6_Click(object sender, EventArgs e)
        {
            ScriptControl msc = new ScriptControl();
            msc.Language = "VBScript";
            StringBuilder l_str = new StringBuilder();

            l_str.Append("function func_1()");
            l_str.AppendLine("\r\n");
            l_str.Append("MsgBox \"call func_1\",vbInformation, \"func_1\"");
            l_str.AppendLine("\r\n");
            l_str.Append("Randomize");
            l_str.AppendLine("\r\n");
            l_str.Append("func_1 = Rnd");
            l_str.AppendLine("\r\n");
            l_str.Append("end function");
            msc.AddCode(l_str.ToString());

            object[] l_args = new object[0];
            object l_obj = msc.Run("func_1", l_args);
            MessageBox.Show(l_obj.ToString());
        }
    }
}

4.ScriptControl接口介绍可参考链接  https://www.cnblogs.com/coolsundy/p/7116123.html

ScriptControl接口

属性名称

类型

备注

AllowUI

BOOL

检测是否允许运行用户的接口元素。如果为False,则诸如消息框之类的界面元素不可见。

CodeObject

Object

脚本暴露给宿主调用的对象。只读。

Modules

Modules

宿主提供给脚本的组件库模块。只读。(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules)

Language

String

设置或获取脚本引擎解释的语言,例如:VBScript、JScript。

Name

String

脚本引擎的名称。只读。

Procedures

Procedures

返回模块中定义的过程的集合

SitehWnd

HWND

在脚本中显示UI的父窗口句柄

State

Enum

设置或返回控件的状态,如果为0,控件只执行语句但不转发事件,为1则为加入的本控件接受的对象转发事件。

Timeout

Long

控件的执行脚本的超时值,-1表示不超时

UseSafeSubset

BOOL

设置或返回宿主程序是否关心安全。宿主程序的安全级别可以从此属性设置

Error

Error

错误对象,发生错误时,此属性返回一个错误对象

方法名称

参数

功能

AddCode

Code As String

往脚本引擎中加入要执行的脚本

AddObject

Name As String, Object As Object, [AddMembers As Boolean = False]

往脚本引擎加入一个对象,以便在脚本中可以使用该对象提供的方法等。

Eval

Expression As String

表达式求值

ExecuteStatement

Statement As String

解释并执行脚本语句

Reset

 

丢弃所有的对象和代码,将State属性置0。

Run

ProcedureName As String, ParamArray Parameters() As Variant

运行一个指定的过程

事件名称

功能

Error

有错误发生时激发该事件

TimeOut

执行过程超时时发生

5.ScriptEngine类,我这里也收藏一份,也许以后可以参考使用,来自链接https://www.xuebuyuan.com/513011.html

using System;
using System.Collections.Generic;
using System.Text;
using MSScriptControl;

namespace MyQuery.CSharpScript
{
    /// 
    /// 脚本运行错误代理
    /// 
    public delegate void RunErrorHandler();

    /// 
    /// 脚本运行超时代理
    /// 
    public delegate void RunTimeoutHandler();

    /// 
    /// 脚本处理引擎
    /// by 开源盛世-源代码下载网 基于网络文章整理开发,是学习自定义脚本的产物
    /// 
    public sealed class ScriptEngine
    {
        private ScriptControlClass msc;
        /// 
        /// 定义脚本运行错误事件
        /// 
        public event RunErrorHandler RunError;
        /// 
        /// 定义脚本运行超时事件
        /// 
        public event RunTimeoutHandler RunTimeout;

        /// 
        ///构造函数
        /// 
        public ScriptEngine()
            : this(ScriptLanguage.JavaScript)
        {
        }

        /// 
        /// 构造函数
        /// 
        /// 脚本类型
        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);
        }

        /// 
        /// 运行Eval方法
        /// 
        /// 表达式
        /// 函数体
        /// 返回值object
        public object Eval(string expression, string codeBody)
        {
            msc.AddCode(codeBody);
            return msc.Eval(expression);
        }

        /// 
        /// 运行Eval方法
        /// 
        /// 脚本语言
        /// 表达式
        /// 函数体
        /// 返回值object
        public object Eval(ScriptLanguage language, string expression, string codeBody)
        {
            if (this.Language != language)
                this.Language = language;
            return Eval(expression, codeBody);
        }

        /// 
        /// 运行Run方法
        /// 
        /// 入口函数名称
        /// 参数
        /// 函数体
        /// 返回值object
        public object Run(string mainFunctionName, object[] parameters, string codeBody)
        {
            this.msc.AddCode(codeBody);
            return msc.Run(mainFunctionName, parameters);
        }

        /// 
        /// 运行Run方法
        /// 
        /// 脚本语言
        /// 入口函数名称
        /// 参数
        /// 函数体
        /// 返回值object
        public object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody)
        {
            if (this.Language != language)
                this.Language = language;
            return Run(mainFunctionName, parameters, codeBody);
        }

        /// 
        /// 放弃所有已经添加到 ScriptControl 中的 Script 代码和对象
        /// 
        public void Reset()
        {
            this.msc.Reset();
        }

        /// 
        /// 获取或设置脚本语言
        /// 
        public ScriptLanguage Language
        {
            get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
            set { this.msc.Language = value.ToString(); }
        }

        /// 
        /// 获取或设置脚本执行时间,单位为毫秒
        /// 
        public int Timeout
        {
            get { return this.msc.Timeout; }
            set { this.msc.Timeout = value; }
        }

        /// 
        /// 设置是否显示用户界面元素
        /// 
        public bool AllowUI
        {
            get { return this.msc.AllowUI; }
            set { this.msc.AllowUI = value; }
        }

        /// 
        /// 宿主应用程序是否有保密性要求
        /// 
        public bool UseSafeSubset
        {
            get { return this.msc.UseSafeSubset; }
            set { this.msc.UseSafeSubset = true; }
        }

        /// 
        /// RunError事件激发
        /// 
        private void OnError()
        {
            if (RunError != null)
                RunError();
        }

        /// 
        /// OnTimeout事件激发
        /// 
        private void OnTimeout()
        {
            if (RunTimeout != null)
                RunTimeout();
        }

        private void ScriptEngine_Error()
        {
            OnError();
        }

        private void ScriptEngine_Timeout()
        {
            OnTimeout();
        }
    }
    /// 
    /// 脚本语言枚举
    /// 
    public enum ScriptLanguage
    {
        /// 
        /// JScript脚本语言
        /// 
        JScript,

        /// 
        /// VBscript脚本语言
        /// 
        VBScript,

        /// 
        /// JavaScript脚本语言
        /// 
        JavaScript
    }

}

6.这篇文章介绍了在64位系统中使用时的解决方案,好像目前仅支持32位系统哦,有兴趣的可以自行研究.

Interop.MSScriptControl in a 64 bit C# application

https://social.msdn.microsoft.com/Forums/vstudio/en-US/f5314ce1-2791-457f-84ea-884bbeb4d57f/interopmsscriptcontrol-in-a-64-bit-c-application

 

7.文章 https://www.xuebuyuan.com/513011.html 中的下半部分涉及到了c#的动态编译运行的实现,有兴趣的可以参考借鉴或者

   查看我的【c#动态编译与代码执行】文章 https://mp.csdn.net/postedit/89924449 

 

8.调用VbScript脚本文件,请参考文章 https://blog.csdn.net/weixin_34419326/article/details/85475760,主要代码这里赋值,具体见下面代码,未做测试.

   vbs_Record.vbs:

Function vbs_Record (strChId,strDate,strStartTime,strStopTime,strTimeLen,strTimeLenS,strCallType,strCallResult,strCallerId,strDtmf,strRecordFile,strSessionId) 

msgbox strChId & " , " & strDate & " , " & strStartTime & " , " & strStopTime & " , " & strTimeLen & " , " & strTimeLenS & " , " & strCallType & " , " & strCallResult & " , " & strCallerId & " , " & strDtmf & " , " & strRecordFile & " , " & strSessionId 

Set cn = CreateObject("ADODB.Connection")
strCn = "provider=SQLOLEDB.1;" & _
"Persist Security Info=False;" & _
"User ID=sa;"& _
"password=*******;" & _
"Initial Catalog=DataBase;" & _
"data source=(local)"

cn.Open strCn

if strCallerId<>"" then
strPhoneNumber=strCallerId
else
strPhoneNumber=strDtmf
end if 

str = "insert into cti_Record(SessionId,StartDate,StartTime,StopTime,TimeLen,PhoneNumber,CallType,RecordFile) values('"+strSessionId+"','"+strDate+"','"+strStartTime+"','"+strStopTime+"','"+strTimeLenS+"','"+strPhoneNumber+"','"+strCallType+"','"+strRecordFile+"')"

cn.Execute str

msgbox "OK"


End function

c#调用. 

string strScript="";
System.IO.StreamReader myReader; 
strScriptFile="d:\\vbs_Record.vbs";
myReader=System.IO.File.OpenText(strScriptFile);

strScript=myReader.ReadLine();
while(myReader.EndOfStream==false)
{
strScript=strScript +@" 
" + myReader.ReadLine();
}
clsScriptEngine scriptEngine = new clsScriptEngine();
scriptEngine.Language = (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), "VBScript");

string[] strParameter=this._strParameter.Split(',');

Object[] objParameter=new Object[12];
objParameter.SetValue(strParameter[0],0);
objParameter.SetValue(strParameter[1],1);
objParameter.SetValue(strParameter[2],2);
objParameter.SetValue(strParameter[3],3);
objParameter.SetValue(strParameter[4],4);
objParameter.SetValue(strParameter[5],5);
objParameter.SetValue(strParameter[6],6);
objParameter.SetValue(strParameter[7],7);
objParameter.SetValue(strParameter[8],8);
objParameter.SetValue(strParameter[9],9);
objParameter.SetValue(strParameter[10],10);
objParameter.SetValue(strParameter[11],11);

scriptEngine.Reset();
scriptEngine.Run("vbs_Record", objParameter, strScript);
scriptEngine = null;

   

你可能感兴趣的:(c#)