FormulaHelper.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using Microsoft.CSharp;
  2. using System;
  3. using System.CodeDom.Compiler;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace SmartCoalApplication.Base.CommTool
  10. {
  11. /// <summary>
  12. /// 公式相关工具类
  13. /// </summary>
  14. public class FormulaHelper
  15. {
  16. /// <summary>
  17. /// 计算公式
  18. /// </summary>
  19. /// <param name="formula">公式</param>
  20. /// <returns></returns>
  21. public static string outPutResult(string formula)
  22. {
  23. try
  24. {
  25. MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControlClass();
  26. sc.Language = "JavaScript";
  27. var str = sc.Eval(formula).ToString();
  28. return str;
  29. }
  30. catch (Exception ex)
  31. {
  32. return "0";
  33. }
  34. }
  35. /// <summary>
  36. /// 接受一个string类型的表达式并计算结果,返回一个object对象,静态方法
  37. /// </summary>
  38. /// <param name="expression"></param>
  39. /// <returns></returns>
  40. public static object Calculate(string expression)
  41. {
  42. try
  43. {
  44. string className = "Calc";
  45. string methodName = "Run";
  46. expression = expression.Replace(" / ", " *1.0/ ");
  47. // 设置编译参数
  48. CompilerParameters paras = new CompilerParameters();
  49. paras.GenerateExecutable = false;
  50. paras.GenerateInMemory = true;
  51. // 创建动态代码
  52. StringBuilder classSource = new StringBuilder();
  53. classSource.Append(" public class " + className + " \n ");
  54. classSource.Append(" {\n ");
  55. classSource.Append(" public object " + methodName + " ()\n ");
  56. classSource.Append(" {\n ");
  57. classSource.Append(" return " + expression + " ;\n ");
  58. classSource.Append(" }\n ");
  59. classSource.Append(" } ");
  60. // 编译代码
  61. CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(paras, classSource.ToString());
  62. // 获取编译后的程序集。
  63. Assembly assembly = result.CompiledAssembly;
  64. // 动态调用方法。
  65. object eval = assembly.CreateInstance(className);
  66. MethodInfo method = eval.GetType().GetMethod(methodName);
  67. object reobj = method.Invoke(eval, null);
  68. GC.Collect();
  69. return reobj;
  70. }
  71. catch (Exception)
  72. {
  73. return "0";
  74. }
  75. }
  76. /// <summary>
  77. /// 计算 字符串表达式
  78. /// </summary>
  79. /// <param name="Formule">字符串计算表达式</param>
  80. /// <returns></returns>
  81. public static string CaleByFormule(string Formule)
  82. {
  83. try
  84. {
  85. Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
  86. return Microsoft.JScript.Eval.JScriptEvaluate(Formule, ve).ToString();
  87. }
  88. catch (Exception)
  89. {
  90. return "0";
  91. }
  92. }
  93. }
  94. }