c# 动态编译CodeDomProvider.CompileAssemblyFromSource(CompilerParameters cp,string code)

1.使用c#动态编译,可参考如下:

//生成c#代码
string code = GenerateCode();
CodeDomProvider cdp = CodeDomProvider.CreateProvider("C#");

// 编译器的参数 
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add(typeof(T).Assembly.Location);
cp.ReferencedAssemblies.Add("System.Core.dll");//添加引用
foreach (var ass in typeof(T).Assembly.GetReferencedAssemblies())
{
    if (ass.Name != "System.Core")
    {
        var refAss = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(assembly => assembly.GetName().Name == ass.Name);
        if (refAss != null)
            cp.ReferencedAssemblies.Add(refAss.Location);
    }
}
//GenerateExecutable是设置编译后生成的是dll还是exe,true是dll,false是exe,默认是生成dll的
cp.GenerateExecutable = false;
//对于GenerateInMemory这个属性,MSDN上说的是true就把编译的生成的程序集保留在内存中,
//通过CompilerResults实例的CompiledAssembly可以获取。如果设为false则是生成文件保存在磁盘上,
//通过CompilerResults实例的PathToAssembly实例获取程序集的路径。事实是,无论GenerateInMemory设置哪个值,
//都会在硬盘上生成相应的文件,区别在于OutputAssembly设置了相应的文件名的话,生成的文件会存在指定路径上,
//否则会存放在系统的临时文件夹里面
cp.GenerateInMemory = true;
//此处如果不加,在某些情况下,默认生成的cp.TempFiles.BasePath=C:UsersAdministratorAppDataLocalTemp2j2uudvfi,而不是
//cp.TempFiles.BasePath=C:UsersAdministratorAppDataLocalTempj2uudvfi,由于2这一层级的文件夹未创建,导致抛出
//"未能找到路径……的一部分"的异常,此处初始化一下cp.TempFiles,则可避免此问题
cp.TempFiles = new TempFileCollection(System.IO.Path.GetTempPath());
CompilerResults cr = cdp.CompileAssemblyFromSource(cp, code);

//动态编译出错时
if (cr.Errors.HasErrors)
{
    Exception ex = new Exception();
    ex.Data["code"] = code;
    throw ex;
}
else
{
    // 编译后的程序集 
    Assembly ass = cr.CompiledAssembly;
    //Namespace是命名空间,Class是类名,赋值为需要的
    Type type = ass.GetType(string.Format("{0}.{1}", Namespace, Class));
    MethodInfo objectToString = type.GetMethod("ObjectToString");
    //动态执行的方法
    structToStringExecutor = new DynamicMethodExecutor(objectToString);
}
原文地址:https://www.cnblogs.com/lcawen/p/11677336.html