C#调用JavaScript引擎

原创 2007年09月25日 17:38:00
下面通过两部分来说明实现以及应用。
一.使用MSScriptControl
到微软的网站上下载Windows Script Control,它是一个ActiveX(R) 控件,所以在.NET中使用我Interop了一下。下载安装完成后,新建一个C#的Windows应用程序项目,在解决方案资源管理器中选中引用节点,右键点击选择添加引用菜单,弹出添加引用对话框,单击浏览找到安装Windows Script Control的目录,选取msscript.ocx文件确定。那么在引用节点下会增加一个MSScriptControl组件,下面是他Interop后的所有对象。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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的函数。输入12,输出12000012
如果把超时时间调整为1毫秒,那么执行该脚本就会跳出下面的超时提醒框,同时激发事件。
 
 下面是测试程序运行界面:

在.NET中利用Google JS V8 Engine实现脚本引擎

原文地址:http://blog.csdn.net/wangjia184/article/details/8520725在.NET中可供集成的脚本语言有很多种选择,LUA 和 Python 都有非常成...
  • wangjia184
  • wangjia184
  • 2013年01月19日 20:57
  • 9354

基于V8引擎的C++和JS的相互交互

基于什么原因略! 1. 脚本引擎的基本功能 V8只是一个JS引擎。去除它的特点功能出处,它必须要实现JS引擎的几个基础功能: 脚本执行: 脚本可能是一个表达式;一段js代码;或...
  • xuehaiwuya_1
  • xuehaiwuya_1
  • 2014年08月06日 20:47
  • 1941

Google V8 JavaScript引擎在服务器端的使用

v8简介: V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google Chrome中 V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效...
  • runnerchen1
  • runnerchen1
  • 2016年02月15日 17:01
  • 2711

c#动态执行代码(Javascript引擎)

  • 2008年12月06日 09:32
  • 2KB
  • 下载

JavaScript引擎研究与C、C++与互调用

C、C++与JavaScript的互调用 1.  概要 JavaScript是一种广泛用于Web客户端开发的脚本语言,常用来控制浏览器的DOM树,给HTML网页添加动态功能。目前JavaScrip...
  • f6991
  • f6991
  • 2013年07月10日 16:02
  • 9022

JavaScript引擎研究总结与C、C++与互调用

什么是JavaScript引擎 什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript代码的运行环境。要解释这一概念,需要了解一些编译原理的基础概念和现代语言需要的一些新...
  • wangbuji
  • wangbuji
  • 2017年04月07日 13:31
  • 494

JavaScript引擎在动态网页采集技术中的应用

  • 2011年12月30日 11:24
  • 182KB
  • 下载

V8 JavaScript引擎内部构造 - Google Developer Day 2009

  • 2011年10月24日 20:39
  • 935KB
  • 下载

JavaScript引擎工作原理

  • 2017年11月25日 23:11
  • 1.78MB
  • 下载

JavaScript引擎v8 二进制版 for Win32

  • 2012年01月07日 20:11
  • 1.03MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#调用JavaScript引擎
举报原因:
原因补充:

(最多只允许输入30个字)