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; } }}