c#动态生成类

本文介绍了一种使用 C# 在 .NET 平台上动态执行代码的方法。通过 CSharpCodeProvider 创建编译器实例,并利用 CodeDom 技术进行编译及执行,实现了条件表达式的动态评估。文章详细展示了如何处理编译错误并利用反射机制调用编译后的程序集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说说你的功能需求? 真的需要动态创建类吗?
.net 支持动态执行 代码


using System;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Text;
/// <summary>
    /// 动态执行代码
    /// </summary>
    public class Evaluator
    {
        public static bool GetWhereReturn(string conditionOne, string conditionTwo)
        {
            // 1.CSharpCodePrivoder 创建编译器实例访问
            CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();


            // 2.ICodeComplier 创建编译器的CodeDom树
            ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();


            // 3.CompilerParameters 设置编译器的参数
            CompilerParameters objCompilerParameters = new CompilerParameters();
            objCompilerParameters.ReferencedAssemblies.Add("System.dll");
            objCompilerParameters.GenerateExecutable = false;
            objCompilerParameters.GenerateInMemory = true;


            // 4.CompilerResults 获取编译器的结果
            CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode(conditionOne, conditionTwo));
            //判断编译错误是否有错误,如果有直接返回false,否则通过反射读取程序集中的公用方法
            if (cr.Errors.HasErrors)
            {
                return false;
            }
            else
            {
                // 通过反射,获取编译器编译的程序集 
                Assembly objAssembly = cr.CompiledAssembly;
                //通过程序集创建对象
                object objRun = objAssembly.CreateInstance("Run");
                //调用对象中的公有方法
                MethodInfo objMI = objRun.GetType().GetMethod("RunCode");
                object[] ob = { conditionOne, conditionTwo };
                return (bool)objMI.Invoke(objRun, ob);


            }
            //return false;
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值