C# 解析js方法,并调用js方法

本文转载:http://www.cnblogs.com/StudyLife/archive/2013/03/11/2953516.html

本文不是基于B/S的 后台调用前台js方法,而是给你一段js方法字符串,让你在程序中直接解析这段方法,并调用方法得到想要的值。

首先要解析Js方法,可以用微软的msscript.ocx控件(Interop.MSScriptControl.dll)来解析js方法.

1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=D05FCF37-4D9F-4769-9442-0BCEEF907033

   或者点击此处下载 Interop.MSScriptControl.dll

2.项目中引用 msscript.ocx 或者 Interop.MSScriptControl.dll

现在通过控件的一些方法可以解析js方法,并调用js方法返回值。

不过这儿可以将控件类的一些属性和方法封装成单独的类,方便自己调用。  封装成ScriptEngine类。

using System;
using MSScriptControl;
using System.Text;

//导入js文件,导入js 方法字符串,然后执行js方法。 通过msscript.ocx控件执行JS脚本 ,先引用  Interop.MSScriptControl.dll
//官网下载: 然后  引用 xxx.ocx就行了  http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=D05FCF37-4D9F-4769-9442-0BCEEF907033
namespace csharp中执行js方法
{
    class script_run
    {
        /// <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;
            /// <summary>
            /// 定义脚本运行错误事件
            /// </summary>
            public event RunErrorHandler RunError;
            /// <summary>
            /// 定义脚本运行超时事件
            /// </summary>
            public event RunTimeoutHandler RunTimeout;

            /// <summary>
            ///构造函数 默认为 VBscript 脚本类型
            /// </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(OnError);
                ((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(OnTimeout);
            }

            /// <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">入口函数名称 例如:add</param>
            /// <param name="parameters">参数:例如:new object(){"",""}</param>
            /// <param name="codeBody">函数体 例如:fucniton add(int a,int b){return a+b;}</param>
            /// <returns>返回值object:获取object.Tostring()</returns>
            public object Run(string mainFunctionName, object[] parameters, string codeBody)
            {
                this.msc.AddCode(codeBody);
                return msc.Run(mainFunctionName,  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 0; }
            }

            /// <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();
            }
        }

    }
}

开始解析js方法。

假如有个js方法:  function  add(var a){return a+1;}

通过上面的ScriptEngine类调用 js:add 方法

*********************************************************************

//声明是Javascript方法

script_run.ScriptEngine myScript = new script_run.ScriptEngine(script_run.ScriptLanguage.JavaScript);  

//js字符串

string  javascriptString=”function add(var a){return a+1;} function test(){}”;

object jsmethodRunValue = myScript.Run("add", new object[] {“3”}, javascriptString);
Console.WriteLine(jsmethodRunValue.ToString());

Console.ReadLine();

*********************************************************************************

昂首阔步,不留一点遗憾

  

时间: 2024-10-01 01:58:54

C# 解析js方法,并调用js方法的相关文章

在JS文件中调用JS文件,可以不停的调用

js 今天本站的广告客户时代互连在本站做的全站漂浮广告,本来是本站已经预设置了一个JS的广告位,并且也有漂浮代码了!但是他们说漂浮的效果好象不好,让我换成他们的JS文件! 于是我开始搜索最终找到了在JS文件中调用其他的JS文件,并且把这种功能可以扩展下: 就是说在1.JS中调用2.JS,在2.JS中调用3.JS--    调用的方法和代码如下: 在1.js中输入下面代码可以调用2.js  document.write("<scr"+"ipt  language=java

前台JS(jquery ajax)调用后台方法实现无刷新级联菜单示例_实用技巧

前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例 CasMenu.aspx页面: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CasMenu.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr

js文件中调用js的实现方法小结_javascript技巧

方法一: Js_file01.js ======== 复制代码 代码如下: //程序代码 document.write(" <script language=\"javascript\" src="\/com\/ Js_file02.js \" > <\/script>"); 方法二: html代码 程序代码 复制代码 代码如下: <html> <body> <input type="

Android webview和js互相调用实现方法_Android

Android-webview和js互相调用 Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5

js调用as方法

问题描述 问题是执行顺序:个人觉得页面先加载标签(flash等),然后执行js方法,js调用flash方法,此时的执行过程是同步的?标签不加载完成,js不会调用as方法? 解决方案 灰常正确,js要放哪里,你可以参考下http://www.iteye.com/problems/81922

js中parseInt()函数使用方法总结(1/2)

parseInt(string, radix) 函数有两个调用方式 1.指定radix,这也是推荐的方式,很不幸我之前都不是这样做的 2.不指定radix,即:parseInt(string).虽然简单,但规则很多,这也是本文阐述内容的核心.   parseInt(string, radix) radix,表示转换的基数,也就是我们常说的2进制.8进制.10进制.16进制等.范围从2~36,但我们在JS中一般调用该方法时,基本都是以10为基数进行转换的. 如果该参数小于 2 或者大于 36,则

window.opener方法的使用 js跨域

原文:window.opener方法的使用 js跨域 最近公司网站登陆加入了第三方登陆.可以用QQ直接登陆到我们网站,在login页面A中点QQ登陆时,调用了一个window.open文件打开一个login页窗口B,登陆后callback地址回调成功后,需要关闭当前window.open打开的login小窗口B,再将打开这个小窗口的原窗口页(A)刷新显示正确状态. 这时就用到了这个方法: window.opener.location.reload() 与 window.opener.locati

图片-jsp中调用java方法,方法中文件路径问题

问题描述 jsp中调用java方法,方法中文件路径问题 我在jsp中了写了java代码调用java类的方法,方法中需要在网页下载一张图片保存 OutputStream os = new FileOutputStream(new File("identityCode/checkimage.JPEG")); 我这样写的,然后一直报 :系统找不到文件路径.路径各种都换了 还是不行 解决方案 解决JSP路径问题的方法jsp路径问题解决方法jsp调用js文件中文乱码问题解决方法 解决方案二: 试

javascript实现方法调用与方法触发小结_基础知识

在js中,this关键字是一个比较让人有意思的东西,但是它的指向经常让初学者摸不着头脑. 其实要理解这个关键字,需要理清两个问题--"方法的调用和方法的触发" 下面先看一段代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>function</title> <script> function showThis(

根据条件(后台处理)调用JS文件

问题描述 请问下如何在后台根据条件来调用JS文件下面是我的一个diaoyong.js文件源码这个是个动态提示信息的小窗口,我把他弄成个JS文件了,我的后台要根据条件判断来调用这个JS文件,如何处理呢?比如:protectedvoidbtnAdd_Click(objectsender,EventArgse){if(条件=符合){执行调用diaoyong.js,或者能调用JS文件里面的varMSG1=newCLASS_MSN_MESSAGE("aa",220,120,"告警信息提