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组件
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位系统哦,有兴趣的可以自行研究.
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;