CodeDomProvider JScript生成计算函数

using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;

namespace TestRunSpeed
{
    public class JSEvaluator
    {
        /// <summary>
        /// 返回Integer类型
        /// </summary>
        /// <param name="statement"></param>
        /// <returns></returns>
        public static int EvalToInteger(string statement)
        {
            string s = EvalToString(statement);
            return int.Parse(s.ToString());
        }
        /// <summary>
        /// 返回Double类型
        /// </summary>
        /// <param name="statement"></param>
        /// <returns></returns>
        public static double EvalToDouble(string statement)
        {
            string s = EvalToString(statement);
            double result;
            bool a = double.TryParse(s, out result);
            if (a) return result;
            else return -99.0;
        }
        /// <summary>
        /// 返回String类型
        /// </summary>
        /// <param name="statement"></param>
        /// <returns></returns>
        public static string EvalToString(string statement)
        {
            object o = EvalToObject(statement);
            return o.ToString();
        }
        /// <summary>
        /// 返回Object类型
        /// </summary>
        /// <param name="statement"></param>
        /// <returns></returns>
        public static object EvalToObject(string statement)
        {
            try
            {
                //根据类型调用指定的方法。绑定约束并匹配指定参数列表
                return _evaluatorType.InvokeMember(
                            "Eval",
                            BindingFlags.InvokeMethod,
                            null,
                            _evaluator,
                            new object[] { statement }
                         );
            }
            catch
            {
                return "null";
            }
        }

        static JSEvaluator()
        {
            //创建编译器
            CodeDomProvider compiler = CodeDomProvider.CreateProvider("JScript");
            //创建引用参数
            CompilerParameters parameters = new CompilerParameters();
            //在内存中生成输出
            parameters.GenerateInMemory = true;
            //返回编译结果
            CompilerResults results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource);
            //获取程序集
            Assembly assembly = results.CompiledAssembly;
            //获取类型
            _evaluatorType = assembly.GetType("Evaluator.Evaluator");
            //获取对象实例
            _evaluator = Activator.CreateInstance(_evaluatorType);
        }
        //编译生成对象
        private static object _evaluator = null;
        //类型
        private static Type _evaluatorType = null;
        //JScript代码
        private static readonly string _jscriptSource =

            @"package Evaluator
            {
               class Evaluator
               {
                  public function Eval(expr : String) : String 
                  { 
                     return eval(expr); 
                  }
               }
            }";
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
using CodeEditor.CodeEdit; using Microsoft.CSharp; using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CodeEditor { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnCompile_Click(object sender, EventArgs e) { //【1】新建C#代码生成器和代码编译器的实例 CodeDomProvider Provider = CodeDomProvider.CreateProvider("CSharp"); //【2】配置用于调用编译器的参数 CompilerParameters Parameters = new CompilerParameters(); Parameters.ReferencedAssemblies.Add("System.dll"); Parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); Parameters.ReferencedAssemblies.Add("System.Linq.dll"); Parameters.GenerateExecutable = false; Parameters.GenerateInMemory = true; //【3】启动编译 CompilerResults Result = Provider.CompileAssemblyFromSource(Parameters, rtbCode.Text); if (Result.Errors.HasErrors) { AppendInfo("编译错误:"); foreach (CompilerError err in Result.Errors) { AppendInfo(err.ErrorText); } } else { // 通过反射,调用实例 Assembly objAssembly = Result.CompiledAssembly; object objHelloWorld = objAssembly.CreateInstance("CodeEditor.CodeEdit.Code"); MethodInfo objMI = objHelloWorld.GetType().GetMethod("Test"); object ReValue = objMI.Invoke(objHelloWorld, null); AppendInfo(ReValue); } } //追加字符 private void AppendInfo(object Info) { rtbResult.Text =Info+"\n\r"; } } }
最新发布
07-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值