C# 任意输入一段表达式,进行运算并输出

来源:互联网 发布:windows主机压力测试 编辑:程序博客网 时间:2024/05/23 14:21
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Microsoft.CSharp;using System.CodeDom.Compiler;namespace ConsoleApplication7{    class Program    {        static void Main(string[] args)        {            Console.Write("请输入一段表达式:");            string str = Console.ReadLine();            double x=0;            double y=0;            double b = Calculate(s,x,y);            Console.WriteLine("计算结果为"+b);            Console.ReadLine();                   }        public static double Calculate(string formula, double x,double y)        {            CSharpCodeProvider provider = new CSharpCodeProvider();            CompilerParameters parameter = new CompilerParameters();            parameter.ReferencedAssemblies.Add("System.dll");            parameter.GenerateExecutable = false; //<--不生成exe            parameter.GenerateInMemory = true; //<--直接在内存运行            CompilerResults result = provider.CompileAssemblyFromSource(parameter,                GenerateCodeBlocks(formula));            //动态编译(VisualStudio F5的时候也是做这个)            if (result.Errors.Count > 0)            {               Console.WriteLine("error");            }            //编译成功            double calculated = Convert.ToDouble(result.CompiledAssembly.GetType("demo.calculation").GetMethod("dowork").Invoke(null, new object[]{x,y}));            //这里通过反射调            return calculated;        }        static string GenerateCodeBlocks(string formula)        {            string code =                "using System;" +                "namespace demo" +                "{" +                   "public static class calculation" +                   "{" +                   "public static double dowork(double x, double y)" +                   "{ return " + formula +                   ";}}}"; //这里是将你的formula和代码片段拼接成完整的程序准备编译的过程。            return code;        }    }}