前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C# 解析js方法,并调用js方法

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

作者头像
跟着阿笨一起玩NET
发布于 2018-09-19 03:25:37
发布于 2018-09-19 03:25:37
5K00
代码可运行
举报
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
本文不是基于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();

 

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

 

 

昂首阔步,不留一点遗憾
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-04-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊PowerJob的Evaluator
tech/powerjob/server/core/evaluator/Evaluator.java
code4it
2024/01/19
1340
聊聊PowerJob的Evaluator
C#二十九 数据封装
如果你经常从事基于.NET的应用程序的数据库开发,你会有这种感觉--总是觉得自己在反复编写相同的数据访问代码。很多相似的代码每天在复制来,粘贴去。你是否想过将数据访问代码包装在一个Helper函数里,以便能够在不同的类中共用?如果你还没有这样做,那么我这里就告诉你如何从复用的角度来设计和包装一个我们自己的数据访问类,从而减少冗余代码,提高开发效率。
用户9184480
2024/12/13
560
C#二十九 数据封装
java利用JDK调用并执行js源码
  不同开发语言之间具有通用性,更具有协作调用的可能。有时候对于一些场景会有调用js的需求,因此下面展示了一个java利用自身JDK调用js函数的demo,供感兴趣的朋友参考。
云海谷天
2022/08/09
1.5K0
C#操作Access通用类
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.Ol
艳艳代码杂货店
2021/10/29
8520
C#封装的Sqlite访问类
C#封装的Sqlite访问类,要访问Sqlite这下简单了,直接调用此类中的方法即可
艳艳代码杂货店
2021/10/27
1.2K0
C# 调用js库的方法
用.NET 6开发一个Winform程序,处理Excel文件,并把结果导出Excel文件。 要用到两个算法,一是turf.js库的booleanPointInPolygon方法,判断经纬度坐标是否在区域内;二是经纬度纠偏算法,因为对方给的区域坐标集合有偏移,需要纠偏。
郑子铭
2023/02/12
11.5K0
C# 调用js库的方法
Java_脚本引擎_01_用法入门
最近有个需求,需要在js中调用java,这样能避免更新java,从而实现代码的热更新。
shirayner
2018/08/10
1.5K0
Java_脚本引擎_01_用法入门
聊聊PowerJob的Evaluator
tech/powerjob/server/core/evaluator/Evaluator.java
code4it
2024/01/12
1420
C#操作SQLite的辅助类
SQLite这个精巧的小数据库,无需安装软件,只需要一个System.Data.SQLite.DLL文件即可操作SQLite数据库。SQLite是 一个开源数据库,现在已变得越来越流行,它的体积很小,被广泛应用于各种不同类型的应用中。
用户7999227
2021/11/02
7580
c#动态执行字符串脚本(优化版)
像javascript中有eval()来执行动态代码,c#中是没有的,于是自己动手丰衣足食,
冰封一夏
2023/03/30
7950
C#笔记:XmlHelper工具
  public static class XmlHelper     {         public static string toSafe(this string strValue)         {             if(!string.IsNullOrEmpty(strValue))             {                 strValue = strValue.Replace("%", "%25");                 strValue = strV
超级大猪
2019/11/22
1.2K0
Web开发常见的几个漏洞解决方法
平时工作,多数是开发Web项目,由于一般是开发内部使用的业务系统,所以对于安全性一般不是看的很重,基本上由于是内网系统,一般也很少会受到攻 击,但有时候一些系统平台,需要外网也要使用,这种情况下,各方面的安全性就要求比较高了,所以往往会交付给一些专门做安全测试的第三方机构进行测试,然 后根据反馈的漏洞进行修复,如果你平常对于一些安全漏洞不够了解,那么反馈的结果往往是很残酷的,迫使你必须在很多细节上进行修复完善。本文主要根据本人 项目的一些第三方安全测试结果,以及本人针对这些漏洞问题的修复方案,介绍在这方面的
wangxl
2018/03/08
1.5K0
Web开发常见的几个漏洞解决方法
前台JS(Jquery)调用后台方法 无刷新级联菜单示例
前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例 CasMenu.aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CasMenu.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio
Porschev
2018/01/16
4.4K0
C# 操作 access 数据库
随笔: (1)   命名空间             using System.Data.OleDb; (2)   连接字符串             private staticstring connStr = @"Provider= Microsoft.Ace.OLEDB.12.0;Data Source = d:\login.accdb";             注意:              a、DataSource = 数据库存放的路径(这里数据库放到了D盘目录下)             
房上的猫
2018/04/04
1.5K0
C#解析PDF
C#解析PDF的方式有很多,比较好用的有ITestSharp和PdfBox。 PDF内容页如果是图片类型,例如扫描件,则需要进行OCR(光学字符识别)。 文本内容的PDF文档,解析的过程中,我目前仅发现能以字符串的形式读取的,不能够读取其中的表格。据说PDF文档结构中是没有表格概念的,因此这个自然是读不到的,如果果真如此,则PDF中表格内容的解析,只能对获取到的字符串按照一定的逻辑自行解析了。 ITestSharp是一C#开源项目,PdfBox为Java开源项目,借助于IKVM在.Net平台下有实现。 Pd
用户1637609
2018/04/12
3K0
最新C#调用Google即时翻译
主要是调用谷歌的翻译API进行翻译,WebRequest的请求,将获取到的翻译提取出来。下面上代码
kiki.
2022/09/29
7790
最新C#调用Google即时翻译
C# 在线编译字符串型语句
            ConstructEvaluator(items);      //调用解析字符串构造函数进行解析  
静谧的小码农
2019/01/11
8320
进阶|C#利用反射方式动态调用类库里的方法(附源码)
做为2020年第一篇技术文章,我们就直接分享一个进阶的的东西,利用反射方式动态调用类库执行方法。
Vaccae
2020/01/13
2.5K0
进阶|C#利用反射方式动态调用类库里的方法(附源码)
java解析表达式Jexl
在项目中,我们可以使用一些表达式来判断是否需要触发警告。例如一些常见的表达式及其含义:
查拉图斯特拉说
2023/10/25
9410
使用Java脚本引擎执行javascript代码示例
– 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从 而达到在 Java 平台上调用各种脚本语言的目的。 – Java 脚本 API 是连通 Java 平台和脚本语言的桥梁。 – 可以把一些复杂异变的业务逻辑交给脚本语言处理,这又大大提高了 开发效率。
bboy枫亭
2021/12/07
3.9K0
使用Java脚本引擎执行javascript代码示例
相关推荐
聊聊PowerJob的Evaluator
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文