C#利用ScriptControl动态执行JS和VBS脚本
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#利用ScriptControl动态执行JS和VBS脚本,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含12246字,纯文字阅读大概需要18分钟。
内容图文
![C#利用ScriptControl动态执行JS和VBS脚本](/upload/InfoBanner/zyjiaocheng/648/c23d5ce9ec0149758ba50039bdc4ef7a.jpg)
方法1:直接调用
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "wscript";
proc.StartInfo.Arguments = " hello.js";
proc.StartInfo.UseShellExecute = false;
proc.Start();
方法2:
使用MS的Windows Script Control
string scr = "function hello(){var WshShell = new ActiveXObject(\"WScript.Shell\");"
+ "var code = \"WScript hello.js\";"
+ "WshShell.Exec(code);}";
MSScriptControl.ScriptControl sc = new ScriptControl();
sc.Language = "JScript";
sc.AllowUI = true;
sc.AddCode(scr);
object[] parameters = new Object[0];
sc.Run("hello", ref parameters);
出处:https://bbs.csdn.net/topics/340163504
==========================================================================================
C#利用ScriptControl动态执行JS和VBS脚本
C#中利用ScriptControl动态执行JS和VBS脚本的实现方法,需要的朋友可以参考下 ? 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 |
执行过程超时时发生 |
/* 添加COM引用:
Library MSScriptControl
C:\WINDOWS\system32\msscript.ocx
Microsoft Script Control 1.0
*/
例子:
复制代码 代码如下:
using MSScriptControl;
namespace zz
{
??? /// <summary>
??? /// scriptengine类
??? /// </summary>
??? public class ScriptEngine
??? {
??????? private ScriptControl msc;
??????? /// <summary>
??????? /// 构造函数
??????? /// </summary>
??????? /// <param name="language">脚本类型,VBscript\JavaScript</param>
??????? public ScriptEngine(string language)
??????? {
??????????? msc = new ScriptControlClass();
??????????? msc.UseSafeSubset = true;
??????????? msc.Language = language;
??????????? ((DScriptControlSource_Event)msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error);
??????????? ((DScriptControlSource_Event)msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);
??????? }
??????? /// <summary>
??????? /// 运行eval方法
??????? /// </summary>
??????? /// <param name="expression">表达式</param>
??????? /// <returns>返回值object</returns>
??????? public object eval(string expression)
??????? {
??????????? return msc.Eval(expression);
??????? }
??????? /// <summary>
??????? /// 运行run方法
??????? /// </summary>
??????? /// <param name="mainfunctionname">入口函数名称</param>
??????? /// <param name="parameters">参数</param>
??????? /// <returns>返回值object</returns>
??????? public object Run(string mainFunctionName, object[] parameters)
??????? {
??????????? return msc.Run(mainFunctionName, ref parameters);
??????? }
??????? /// <summary>
??????? /// 加入要执行的脚本
??????? /// </summary>
??????? /// <param name="Code"></param>
??????? public void AddCode(string Code)
??????? {
??????????? msc.AddCode(Code);
??????? }
??????? /// <summary>
??????? /// 解析并运行
??????? /// </summary>
??????? /// <param name="Code">代码</param>
??????? public void ExecuteStatement(string Code)
??????? {
??????????? msc.ExecuteStatement(Code);
??????? }
??????? /// <summary>
??????? /// 放弃所有已经添加到 scriptcontrol 中的 script 代码和对象
??????? /// </summary>
??????? public void Reset()
??????? {
??????????? msc.Reset();
??????? }
??????? /// <summary>
??????? /// 获取或设置脚本语言
??????? /// </summary>
??????? public string Language
??????? {
??????????? get { return msc.Language; }
??????????? set { msc.Language = value; }
??????? }
??????? /// <summary>
??????? /// 获取或设置脚本执行时间,单位为毫秒
??????? /// </summary>
??????? public int Timeout
??????? {
??????????? get { return ((IScriptControl)msc).Timeout; }
??????????? set { ((IScriptControl)msc).Timeout = value; }
??????? }
??????? /// <summary>
??????? /// 设置是否显示用户界面元素
??????? /// </summary>
??????? public bool AllowUI
??????? {
??????????? get { return msc.AllowUI; }
??????????? set { msc.AllowUI = value; }
??????? }
??????? /// <summary>
??????? /// 宿主应用程序是否有保密性要求
??????? /// </summary>
??????? public bool UseSafeSubset
??????? {
??????????? get { return msc.UseSafeSubset; }
??????????? set { msc.UseSafeSubset = true; }
??????? }
??????? private void ScriptEngine_Error()
??????? {
??????????? //错误事件
??????? }
??????? private void ScriptEngine_Timeout()
??????? {
??????????? //超时事件
??????? }
??? }
} ?
出处:https://www.jb51.net/article/35314.htm
==============================================================================
解决方案
1.工程引用 Interop.MSScriptControl.dll
2.创建一个类,代码如下:
using System;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 one rror()
{
if (RunError !=null)
RunError();
}
///<summary>
/// OnTimeout事件激发
///</summary>
privatevoid OnTimeout()
{
if (RunTimeout !=null)
RunTimeout();
}
privatevoid ScriptEngine_Error()
{
one rror();
}
privatevoid ScriptEngine_Timeout()
{
OnTimeout();
}
}
}
3.创建一个名为vbs_Record.vbs 的VbScrpt,代码如下:
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
4.C#调用此VB脚本,代码如下:
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;
出处:https://www.cnblogs.com/hailexuexi/archive/2011/02/15/1955166.html
内容总结
以上是互联网集市为您收集整理的C#利用ScriptControl动态执行JS和VBS脚本全部内容,希望文章能够帮你解决C#利用ScriptControl动态执行JS和VBS脚本所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。