首页 > 编程语言 >C#利用js脚本实现配置的文本表达式计算

C#利用js脚本实现配置的文本表达式计算

时间:2022-11-18 19:12:00浏览次数:41  
标签:return string language C# object js msc public 表达式


using System;
using System.Collections.Generic;
using System.Text;
using MSScriptControl;


namespace MyQuery.CSharpScript
{
    /// <summary>
    /// 脚本运行错误代理
    /// </summary>
    public delegate void RunErrorHandler();


    /// <summary>
    /// 脚本运行超时代理
    /// </summary>
    public delegate void RunTimeoutHandler();


    /// <summary>
    /// 脚本处理引擎
    /// by 开源盛世-源代码下载网 基于网络文章整理开发,是学习自定义脚本的产物
    /// </summary>
    public sealed class ScriptEngine
    {
        private ScriptControlClass msc;
        /// <summary>
        /// 定义脚本运行错误事件
        /// </summary>
        public event RunErrorHandler RunError;
        /// <summary>
        /// 定义脚本运行超时事件
        /// </summary>
        public event RunTimeoutHandler RunTimeout;


        /// <summary>
        ///构造函数
        /// </summary>
        public ScriptEngine()
            : this(ScriptLanguage.JavaScript)
        {
        }


        /// <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, 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 one rror()
        {
            if (RunError != null)
                RunError();
        }


        /// <summary>
        /// OnTimeout事件激发
        /// </summary>
        private void OnTimeout()
        {
            if (RunTimeout != null)
                RunTimeout();
        }


        private void ScriptEngine_Error()
        {
            one rror();
        }


        private void ScriptEngine_Timeout()
        {
            OnTimeout();
        }
    }
    /// <summary>
    /// 脚本语言枚举
    /// </summary>
    public enum ScriptLanguage
    {
        /// <summary>
        /// JScript脚本语言
        /// </summary>
        JScript,


        /// <summary>
        /// VBscript脚本语言
        /// </summary>
        VBScript,


        /// <summary>
        /// JavaScript脚本语言
        /// </summary>
        JavaScript
    }

}

欢迎访问:​​http://121.18.78.216​​ 适易查询分析、工作流、内容管理及项目管理演示平台

标签:return,string,language,C#,object,js,msc,public,表达式
From: https://blog.51cto.com/u_14751752/5868959

相关文章

  • 二级联动 js脚本
    //二级联动说明:联动的select的值必须匹配allinfo为二级所有值的数组格式为value|text  //贾世义functionselectChange(obj,changeId,allinfo){   varselV......
  • luogu P7201 [COCI2019-2020#1] Džumbus题解
    须知本题解骨架是本人由官方题解翻译得来的,并补充了一些不详细的地方,修改了一些错误,自己写了每一个子任务的代码(因为官方题解代码和文本不太匹配)。基本信息任务名:Džumb......
  • C++编写Time类显示系统时间
    编写Time类,要求:(1)包含年、月、日、时、分、秒的信息。(2)构造函数将类的对象初始化为系统当前时间(使用头文件time.h中的time函数。)(3)能按照标准格式输出对象表示的时间。......
  • PHP COUNT
    count()返回数组中的元素的个数<?php$cars=array("Volvo","BMW","Toyota");echocount($cars);?>3......
  • 【USACO2021 February Contest Platinum】Minimizing Edges(图论,贪心)
    传送门设\(d_0(u),d_1(u)\)分别表示\(1\)到\(u\)的偶数长最短路和奇数长最短路。那么即为要求\(G,G'\)的\(d_0,d_1\)都相同。先特判掉二分图的情况,这样任意\(......
  • Push rejected: Push to origin/master was rejected错误解决方案
    解决方案如下:1.切换到自己项目所在的目录,右键选择GITBASHHere,Idea中可使用Alt+F122.在terminl窗口中依次输入命令:gitpullgitpulloriginmastergitpullorigin......
  • PHP 常量define以及 echo constant
    PHP常量是一个简单值的标识符。该值在脚本中不能改变相当于(常量名不需要加$修饰符)c/c++中的#definexvalue设置常量,使用define()函数,函数语法如下:booldefine(st......
  • Seata 1.5.2 源码学习(Client端)
    在上一篇中通过阅读Seata服务端的代码,我们了解到TC是如何处理来自客户端的请求的,今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的。要想搞清楚这一点,还得从Glob......
  • R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列|附代
    原文链接:http://tecdat.cn/?p=26897风险价值(VaR)是金融风险管理中使用最广泛的市场风险度量,也被投资组合经理等从业者用来解释未来市场风险风险价值(VaR)VaR可以......
  • CVE-2022-39197 复现
    CVE-2022-39197......