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
/// <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
参考文档:
ASP.NET通过HttpContext获取IP地址
通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
.NET Reactor(.NET混淆器)加壳软件使用|C/S开发框架
CSFramework开发框架使用.NET Reactor加壳软件导致多语言失效|C/S开发框架
C/S架构软件开发平台旗舰版V6.0 | 使用FastReport.NET制作二维码报表|C/S开发框架
VS2022+.NET 部署DevExpress V23.2|C/S开发框架
VS2022 .NET7手动更改组件类型(TextEdit改为ComboBoxEdit)|C/S开发框架
WinFormsApp窗体应用快速开发框架(.NET7+EFCore+VS2022)
CSFrameworkV6 | 软件用户数授权 | 通过控制在线用户数实现逻辑|C/S开发框架
DevExpress 通过小三角图标变更控件类型|C/S开发框架
VS2022/.NET7:CA1416:可在所有平台上访问此调用站点。"xxx"仅在 'windows'上受支持。
VS2022+FastReport.NET 安装环境支持
FastReport.NET报错 System.PlatformNotSupportedException:“Operation is not supported on this platform.”
C#.NET7 VS2022 使用反射动态设置按钮Click事件
ASP.NET通过HttpContext获取IP地址
通过.NET反射动态调用SetValue方法给属性PropertyInfo赋值
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
C#.NET各版本常用语法糖大全(C#3~C#10)|C/S开发框架
.NET Reactor(.NET混淆器)加壳软件使用|C/S开发框架
CSFramework开发框架使用.NET Reactor加壳软件导致多语言失效|C/S开发框架
C/S架构软件开发平台旗舰版V6.0 | 使用FastReport.NET制作二维码报表|C/S开发框架
VS2022+.NET 部署DevExpress V23.2|C/S开发框架
VS2022 .NET7手动更改组件类型(TextEdit改为ComboBoxEdit)|C/S开发框架
WinFormsApp窗体应用快速开发框架(.NET7+EFCore+VS2022)
CSFrameworkV6 | 软件用户数授权 | 通过控制在线用户数实现逻辑|C/S开发框架
DevExpress 通过小三角图标变更控件类型|C/S开发框架
VS2022/.NET7:CA1416:可在所有平台上访问此调用站点。"xxx"仅在 'windows'上受支持。
VS2022+FastReport.NET 安装环境支持
FastReport.NET报错 System.PlatformNotSupportedException:“Operation is not supported on this platform.”
C#.NET7 VS2022 使用反射动态设置按钮Click事件
其它资料:
什么是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内容管理系统 |
什么是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内容管理系统 |
在线客服
