ScriptControl 对支持 ActiveX(TM) Script 的宿主 Script 引擎提供简单接口。接下来我们对被转化成ScriptControlClass类的ScriptControl的属性和方法进行一些说明。
UseSafeSubset 属性:设置或返回 Boolean 值,指明宿主应用程序是否有保密性要求。如果宿主应用程序需要安全控制,则 UseSafeSubset 为 True,否则为 False。可读写。
AllowUI 属性如果设置为false,则显示对话框之类的语句不起作用,如在 VBScript 中MsgBox 语句,JavaScript中的alert等,并且如果执行的脚本超出TimeOut设置的毫秒数,也不会跳出超出时间提醒的对话框,反之则相反;重新设置 Language 属性会清空AddCode加载的代码;对于TimeOut属性,发生超时时,ScriptControl 检查对象的 AllowUI 属性,确定是否允许显示用户界面元素。
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 parameters);
}
/// <summary>
/// 运行Run方法
/// </summary>
/// <param name="language">脚本语言</param>
/// <param name="mainFunctionName">入口函数名称</param>
/// <param name="parameters">参数</param>
/// <param name="codeBody">函数体</param>
/// <returns>返回值object</returns>
public object 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>
public void 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>
public int Timeout
{
get{return this.msc.Timeout;}
set{this.msc.Timeout = value;}
}
/// <summary>
/// 设置是否显示用户界面元素
/// </summary>
public bool AllowUI
{
get{return this.msc.AllowUI;}
set{this.msc.AllowUI = value;}
}
/// <summary>
/// 宿主应用程序是否有保密性要求
/// </summary>
public bool UseSafeSubset
{
get{return this.msc.UseSafeSubset;}
set{this.msc.UseSafeSubset = true;}
}
/// <summary>
/// RunError事件激发
/// </summary>
private void OnError()
{
if(RunError!=null)
RunError();
}
/// <summary>
/// OnTimeout事件激发
/// </summary>
private void OnTimeout()
{
if(RunTimeout!=null)
RunTimeout();
}
private void ScriptEngine_Error()
{
OnError();
}
private void ScriptEngine_Timeout()
{
OnTimeout();
}
}
}
上面的包装定义了一个ScriptLanguage枚举,这样操作起来更方便一点。另外脚本引擎包括了Error事件和Timeout事件,根据实际使用情况可进行注册。
二.脚本引擎演示
我建了个窗体程序,测试包括脚本语言的选择,是否开启AllowUI属性,超时时间的设置,以及脚本引擎调用方法的选择。测试程序代码比较长,下面列出了主要部分:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace ZZ
{
public class Form1 : System.Windows.Forms.Form
{
private ScriptEngine scriptEngine;
private System.Windows.Forms.CheckBox checkBoxAllowUI;
private System.Windows.Forms.TextBox textBoxResult;
private System.Windows.Forms.NumericUpDown numericUpDownTimeout;
private System.Windows.Forms.TextBox textBoxCodeBody;
private System.Windows.Forms.Button buttonRun;
private System.Windows.Forms.Button buttonCancel;
private System.Windows.Forms.ComboBox comboBoxScript;
private System.Windows.Forms.TextBox textBoxParams;
private System.Windows.Forms.RadioButton radioButtonEval;
private System.Windows.Forms.RadioButton radioButtonRun;
private System.Windows.Forms.TextBox textBoxMethodName;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
this.comboBoxScript.SelectedIndex = 0;
this.scriptEngine = new ScriptEngine();
this.scriptEngine.UseSafeSubset = true;
this.scriptEngine.RunError += new RunErrorHandler(scriptEngine_RunError);
this.scriptEngine.RunTimeout += new RunTimeoutHandler(scriptEngine_RunTimeout);
}
protected override void Dispose( bool disposing )
{
if( disposing )
if (components != null)
components.Dispose();
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
private void InitializeComponent()
{
//省略
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
//运行脚本
private void buttonRun_Click(object sender, System.EventArgs e)
{
this.scriptEngine.Reset();
this.scriptEngine.Language = (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage),this.comboBoxScript.SelectedItem.ToString());
this.scriptEngine.Timeout = (int)this.numericUpDownTimeout.Value;
this.scriptEngine.AllowUI = this.checkBoxAllowUI.Checked;
if(this.radioButtonEval.Checked)//执行Eval方法
{
this.textBoxResult.Text = this.scriptEngine.Eval(this.textBoxMethodName.Text+"("+this.textBoxParams.Text+")",this.textBoxCodeBody.Text).ToString();
}
else//执行Run方法
{
string[] parameters = (string[])this.textBoxParams.Text.Split(',');
object [] paramArray = new object[parameters.Length];
for(int i = 0;i<parameters.Length;i++)
paramArray[i] = Int32.Parse(parameters[i]);
this.textBoxResult.Text = this.scriptEngine.Run(this.textBoxMethodName.Text,paramArray,this.textBoxCodeBody.Text).ToString();
}
}
//退出程序
private void buttonCancel_Click(object sender, System.EventArgs e)
{
this.Close();
}
//错误函数
private void scriptEngine_RunError()
{
MessageBox.Show("RunError执行脚本错误!");
}
private void scriptEngine_RunTimeout()
{
MessageBox.Show("RunTimeout执行脚本超时,引发错误!");
}
}
}
下面是测试程序运行界面:
总结,上面演示了JavaScript脚本,如果有兴趣读者可以写一些VBsript函数进行测试,脚本语言也只列出了三种,看了帮助,他还支持其他一些脚本,如果需要可以添加。另外,因为是调用Com,有些返回值是obejct类型的,需要进行转换。
相关推荐
在C#中调用VBScript和JavaScript等脚本语言,主要依赖于Microsoft的Windows Script Control,这是一个ActiveX控件,可以通过.NET Framework的Interop服务来使用。以下是如何实现这一功能的详细步骤和相关知识点: ...
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
本文将深入探讨VBScript和JavaScript互相调用的方法,以及它们在ASP环境中的应用,帮助读者理解这两种脚本语言如何协同工作。 ### VBScript与JavaScript的基本介绍 VBScript(Visual Basic Scripting Edition)是...
本主题涉及的是如何在C#中动态解析和执行JavaScript代码,这通常通过使用脚本引擎来实现。 一个常见的C#脚本引擎是Microsoft的JScript.NET,但它并不支持最新的JavaScript特性。为了处理现代JavaScript,开发者通常...
例如,可以在C#中创建一个类来封装这些数据,然后在VBScript中引用这个类的实例。 另外,关于`TransferOfficeVBA`这个文件名,这可能指的是一个用于转移Office VBA(Visual Basic for Applications)宏的工具或脚本...
在Unity 3D开发环境中,有时我们可能需要在C#脚本和JavaScript脚本之间进行交互,例如在C#中触发JavaScript函数或者反之。要实现这种互调用,需要了解Unity的编译过程以及特定的目录结构规则。下面将详细讨论如何在...
标题中的"C#(ASPx)调用VBScript"是指在C# ASP.NET环境中,如何集成和执行VBScript脚本。这种技术通常用于处理一些遗留的ASP应用或者利用VBScript的某些特性。在ASP.NET(ASPx)中,虽然主要使用C#或VB.NET作为后端...
在C#中调用这样的脚本,可能是在WinForm应用中执行对Office文档的操作,如数据导入导出、格式转换等。 总之,C#调用VBS脚本是一个实用的技术,能够结合两者的优点,实现更复杂的应用场景。通过Process类,我们可以...
在IT领域,尤其是在桌面应用程序开发中,有时我们需要在C#这样的强类型编程语言与JavaScript这样的脚本语言之间建立通信桥梁。这种交互性可以为应用程序带来更丰富的用户界面和动态功能。本篇将深入探讨如何利用`...
在.NET框架中,C#作为常用的编程语言,可以与各种其他技术进行交互,其中包括调用VBScript(Visual Basic Script)脚本。VBScript是一种轻量级的解释型脚本语言,广泛应用于Windows环境,尤其在自动化任务和网页脚本...
在C# WinForm应用中调用B/S架构中的JavaScript方法主要涉及到的是客户端与服务器端的交互问题。在传统的Web开发中,B/S架构通常由浏览器(客户端)与服务器(后端)组成,而C# WinForm是桌面应用程序,它们之间进行...
在开发Web应用时,有时需要在前端JavaScript代码中与后端C#代码进行交互,以实现数据的交换或处理复杂的业务逻辑。标题"JS调用C#后台方法"描述了这种跨语言通信的需求。本文将深入探讨如何使用JavaScript调用C#编写...
这个“游戏引擎实现c++调用c#脚本功能mono.rar”压缩包包含的文件正是与这个过程相关的Mono库。 Mono是一个开源的.NET框架实现,它使得开发者可以在多个平台上运行基于.NET的应用,包括游戏引擎中的脚本。在Unity中...
C#中调用libvlc实现本地、网络节目流的播放 基于libVLC的视频播放器(支持RTSP协议)
- 类似于方法1中的示例,可以在C#中通过实例化Java类并调用其方法来实现跨语言的调用功能。 #### 总结 通过上述两种方法,我们能够有效地在C#环境中使用Java开发的类库。这种方式不仅扩展了.NET平台的功能,还...
本文将深入探讨如何在C#中使用WinGraphviz库来解析和渲染dot脚本,以及通过提供的WinGraphvizDemo示例项目了解其实现细节。 首先,我们需要了解WinGraphviz库。这是一个.NET封装的Graphviz库,它允许开发者在C#、VB...
根据给定的信息,本文将详细探讨C#与JavaScript之间的相互调用方法,主要涉及四个方面的内容:如何在JavaScript中访问C#函数、如何在JavaScript中访问C#变量、如何在C#中访问JavaScript已有的变量以及如何在C#中访问...
1. **JavaScript**:JavaScript是一种广泛使用的客户端脚本语言,主要在用户的浏览器中运行,用于实现网页的动态功能,如表单验证、动画效果和实时用户交互。 2. **C#**:C#是微软开发的一种面向对象的编程语言,常...
2. 调用C#方法:在JavaScript中,可以使用`window.chrome.webview`对象的`call`方法来调用C#方法。假设我们有一个名为`addNumbers`的C#方法,接受两个整数参数并返回它们的和,JavaScript代码可能如下: ```...