C# 任意輸入一段表達式,進行運算並輸出

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

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章