现在的位置: 首页 > 综合 > 正文

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

2013年12月12日 ⁄ 综合 ⁄ 共 1247字 ⁄ 字号 评论关闭
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;
        }

    }
}

抱歉!评论已关闭.