动态编译简单的说将字符串转化成代码然后编译返回结果
private void button1_Click(object sender, EventArgs e)
{
CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");//创建编译器
CompilerParameters objCompilerParameters = new CompilerParameters();//创建编译器参数
objCompilerParameters.ReferencedAssemblies.Add("System.dll");//为当前程序集添加引用
objCompilerParameters.GenerateExecutable = false;// 是否生成exe文件
objCompilerParameters.GenerateInMemory = true;// 是否在内存在输出
//comPara.OutputAssembly = "Compile.exe"; // 输出文件
CompilerResults cr = provider.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());//直接执行
if (cr.Errors.HasErrors)
{
Console.WriteLine("编译错误:");
foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
}
else
{
// 通过反射,调用HelloWorld的实例
Assembly objAssembly = cr.CompiledAssembly;
object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
MessageBox.Show(objMI.Invoke(objHelloWorld, new Object[] { 0.1 }).ToString());
}
}
static string GenerateCode()
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("namespace DynamicCodeGenerate");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class HelloWorld");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public string OutPut(double NC)");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" return (NC<0.05?0.105:NC+0.055).ToString();");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}");
string code = sb.ToString();
return code;
}