明辉站/编程语言/内容

在C#中调用VBScript等脚本的完成(下)

网站教程2024-01-14 阅读
[摘要]/// <summary> /// 获取或设置脚本语言 /// </summary> public ScriptLanguage Language getreturn (Script...

 }         /// <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的函数。输入12,输出12000012。  如果把超时时间调整为1毫秒,那么执行该脚本就会跳出下面的超时提醒框,同时激发事件。  总结:上面演示了JavaScript脚本,如果有兴趣读者可以写一些VBsript函数进行测试,脚本语言也只列出了三种,看了帮助,他还支持其他一些脚本,如果需要可以添加。另外,因为是调用Com,有些返回值是obejct类型的,需要进行转换。在CSDN的技术论坛C#板块下时常有朋友问这方面的问题,对于碰到这类问题的朋友,希望通过这篇文章能获得一些你需要的帮助,很高兴能和搞.net的朋友进行交流,我的邮件地址zhzuocn@163.com

……

相关阅读