C#.NET通过CodeDom.Compiler动态编译计算表达式的值
C#.NET通过CodeDom.Compiler动态编译计算表达式的值
程序说明: C#动态编译计算表达式的值,是通过System.CodeDom.Compiler命名空间下的相关类来实现的, 如:CSharpCodeProvider类。 步骤如下: 1.将表达式封装成为可编译的C#代码; 2.动态编译C#代码,生成Assembly程序集。 3.使用.NET反射调用方法计算表达式的值。 C# Code: /// <summary> /// 程序说明:C#动态编译计算表达式的值,是通过System.CodeDom.Compiler命名空间下的相关类来实现的,如:CSharpCodeProvider类。步骤如下: /// 1.将表达式封装成为可编译的C#代码; /// 2.动态编译C#代码,生成Assembly程序集。 /// 3.使用.NET反射调用方法计算表达式的值。 /// </summary> public static class CodeDomExpression { public static decimal Calculate(string expression) { try { return decimal.Parse(DoCalculate(expression).ToString()); } catch { return 0; } } /// <summary> /// 计算表达式的值 /// </summary> /// <param name="expression">表达式</param> /// <returns></returns> private static object DoCalculate(string expression) { string code = DoWrapCode(expression); CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider(); CompilerParameters compilerParameters = new CompilerParameters(); compilerParameters.CompilerOptions = "/t:library"; compilerParameters.GenerateInMemory = true; //编译C#源码,稍有停顿! CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(compilerParameters, code); if (compilerResults.Errors.Count > 0) throw new Exception("编译表达式出错!"); Assembly assembly = compilerResults.CompiledAssembly; Type type = assembly.GetType("ExpressionCalculate"); MethodInfo method = type.GetMethod("Calculate"); return method.Invoke(null, null); } /// <summary> /// 封装C#代码 /// </summary> /// <param name="expression"></param> /// <returns></returns> private static string DoWrapCode(string expression) { string code = @" using System; public class ExpressionCalculate { public static object Calculate() { return {0}; } }"; return code.Replace("{0}", expression); } } //来源:C/S框架网(www.csframework.com) QQ:23404761
参考文档:
Delphi程序调用C#.Net编译的DLL并打开窗体(详解) C# 动态编译及调用WebService的方法 C#正则表达式整理备忘 C#使用正则表达式判断手机号码 C#.NET 身份证号码格式正则表达式验证 C#.NET IP地址正则表达式验证 C#.NET 手机号码正则表达式验证 C#.NET扩展的动态对象支持动态属性和方法以及Json格式与对象互转 C#.NET 定义动态对象dynamic以及属性和方法 C#.NET 定义动态对象dynamic以及转换JSON字符串 通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值 FastReport.NET制作动态栏位列报表C#实例 C#正则表达式查找或替换指定字符串(标识)范围的内容 C#使用正则表达式移除所有的Html标记,返回纯文本 C#使用正则表达式替换或去掉半角标点符号
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |