using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace SmartCoalApplication.Base.CommTool
{
///
/// 公式相关工具类
///
public class FormulaHelper
{
///
/// 计算公式
///
/// 公式
///
public static string outPutResult(string formula)
{
try
{
MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControlClass();
sc.Language = "JavaScript";
var str = sc.Eval(formula).ToString();
return str;
}
catch (Exception ex)
{
return "0";
}
}
///
/// 接受一个string类型的表达式并计算结果,返回一个object对象,静态方法
///
///
///
public static object Calculate(string expression)
{
try
{
string className = "Calc";
string methodName = "Run";
expression = expression.Replace(" / ", " *1.0/ ");
// 设置编译参数
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
// 创建动态代码
StringBuilder classSource = new StringBuilder();
classSource.Append(" public class " + className + " \n ");
classSource.Append(" {\n ");
classSource.Append(" public object " + methodName + " ()\n ");
classSource.Append(" {\n ");
classSource.Append(" return " + expression + " ;\n ");
classSource.Append(" }\n ");
classSource.Append(" } ");
// 编译代码
CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(paras, classSource.ToString());
// 获取编译后的程序集。
Assembly assembly = result.CompiledAssembly;
// 动态调用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect();
return reobj;
}
catch (Exception)
{
return "0";
}
}
///
/// 计算 字符串表达式
///
/// 字符串计算表达式
///
public static string CaleByFormule(string Formule)
{
try
{
Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(Formule, ve).ToString();
}
catch (Exception)
{
return "0";
}
}
}
}