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

简介: 本文转载:http://www.cnblogs.com/StudyLife/archive/2013/03/11/2953516.html 本文不是基于B/S的 后台调用前台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();

 

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

 

 

昂首阔步,不留一点遗憾

  

目录
相关文章
|
2月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
193 69
|
2月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
91 8
|
1月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
135 0
|
2月前
|
存储 监控 算法
解析公司屏幕监控软件中 C# 字典算法的数据管理效能与优化策略
数字化办公的时代背景下,企业为维护信息安全并提升管理效能,公司屏幕监控软件的应用日益普及。此软件犹如企业网络的 “数字卫士”,持续记录员工电脑屏幕的操作动态。然而,伴随数据量的持续增长,如何高效管理这些监控数据成为关键议题。C# 中的字典(Dictionary)数据结构,以其独特的键值对存储模式和高效的操作性能,为公司屏幕监控软件的数据管理提供了有力支持。下文将深入探究其原理与应用。
61 4
|
3月前
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
75 2
|
1月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
188 80
|
1月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
80 19
|
2月前
|
JSON 前端开发 Serverless
Mock.js 语法结构全解析
Mock.js 的语法规范介绍,从数据模板定义规范和数据占位符定义规范俩部分介绍, 让你更好的使用 Mock.js 来模拟数据并提高开发效率。
|
3月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解
|
4月前
|
数据采集 前端开发 JavaScript
金融数据分析:解析JavaScript渲染的隐藏表格
本文详解了如何使用Python与Selenium结合代理IP技术,从金融网站(如东方财富网)抓取由JavaScript渲染的隐藏表格数据。内容涵盖环境搭建、代理配置、模拟用户行为、数据解析与分析等关键步骤。通过设置Cookie和User-Agent,突破反爬机制;借助Selenium等待页面渲染,精准定位动态数据。同时,提供了常见错误解决方案及延伸练习,帮助读者掌握金融数据采集的核心技能,为投资决策提供支持。注意规避动态加载、代理验证及元素定位等潜在陷阱,确保数据抓取高效稳定。
111 17

热门文章

最新文章

推荐镜像

更多
  • DNS