解决方案
1.工程引用 Interop.MSScriptControl.dll
2.创建一个类,代码如下:
using System.Collections.Generic;
using System.Text;
using MSScriptControl;
namespace myClass
{
///<summary>
/// 脚本类型
///</summary>
publicenum ScriptLanguage
{
///<summary>
/// JScript脚本语言
///</summary>
JScript,
///<summary>
/// VBscript脚本语言
///</summary>
VBScript,
///<summary>
/// JavaScript脚本语言
///</summary>
JavaScript
}
///<summary>
/// 脚本运行错误代理
///</summary>
publicdelegatevoid RunErrorHandler();
///<summary>
/// 脚本运行超时代理
///</summary>
publicdelegatevoid RunTimeoutHandler();
///<summary>
/// ScriptEngine类
///</summary>
publicclass clsScriptEngine
{
private ScriptControl msc;
//定义脚本运行错误事件
publicevent RunErrorHandler RunError;
//定义脚本运行超时事件
publicevent RunTimeoutHandler RunTimeout;
///<summary>
///构造函数
///</summary>
public clsScriptEngine()
: this(ScriptLanguage.VBScript)
{
}
///<summary>
/// 构造函数
///</summary>
///<param name="language">脚本类型</param>
public clsScriptEngine(ScriptLanguage language)
{
this.msc =new ScriptControlClass();
//this.msc.UseSafeSubset = true; //使用安全的子集,如果等于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>
publicobject 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>
publicobject 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>
publicobject 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>
publicobject 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>
publicvoid Reset()
{
this.msc.Reset();
}
///<summary>
/// 获取或设置脚本语言
///</summary>
public ScriptLanguage Language
{
get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
set { this.msc.Language = value.ToString(); }
}
///<summary>
/// 获取或设置脚本执行时间,单位为毫秒
///</summary>
///<summary>
/// 设置是否显示用户界面元素
///</summary>
publicbool AllowUI
{
get { returnthis.msc.AllowUI; }
set { this.msc.AllowUI = value; }
}
///<summary>
/// 宿主应用程序是否有保密性要求
///</summary>
publicbool UseSafeSubset
{
get { returnthis.msc.UseSafeSubset; }
set { this.msc.UseSafeSubset =true; }
}
///<summary>
/// RunError事件激发
///</summary>
privatevoid OnError()
{
if (RunError !=null)
RunError();
}
///<summary>
/// OnTimeout事件激发
///</summary>
privatevoid OnTimeout()
{
if (RunTimeout !=null)
RunTimeout();
}
privatevoid ScriptEngine_Error()
{
OnError();
}
privatevoid ScriptEngine_Timeout()
{
OnTimeout();
}
}
}
3.创建一个名为vbs_Record.vbs 的VbScrpt,代码如下:
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
4.C#调用此VB脚本,代码如下:
System.IO.StreamReader myReader;
strScriptFile="d:\\vbs_Record.vbs";
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;
