动态编译C# 代码
很多时候需要将某段C# 代码写在配置文件中,后续需要时进行编译;
比如,在配置文件中配置上“"echo.shine"=="echo.shine"”,然后将此段配置文件放进下面的方法中进行编译,就会得出true的值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static bool getExpressionValue(string expression)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameter = new CompilerParameters();
parameter.ReferencedAssemblies.Add("System.dll");
parameter.GenerateExecutable = false;
parameter.GenerateInMemory = true;
var comp_string = @"
using System;
namespace ANameSpace
{
static class AClass
{
public static object AFunc()
{return " + expression + @";}
}
}";
CompilerResults result = provider.CompileAssemblyFromSource(parameter,
comp_string);
if (result.Errors.Count > 0)
{
return false;
}
else
{
Assembly assembly = result.CompiledAssembly;
Type AType = assembly.GetType("ANameSpace.AClass");
MethodInfo method = AType.GetMethod("AFunc");
return Convert.ToBoolean(method.Invoke(null, null));
}
}
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameter = new CompilerParameters();
parameter.ReferencedAssemblies.Add("System.dll");
parameter.GenerateExecutable = false;
parameter.GenerateInMemory = true;
var comp_string = @"
using System;
namespace ANameSpace
{
static class AClass
{
public static object AFunc()
{return " + expression + @";}
}
}";
CompilerResults result = provider.CompileAssemblyFromSource(parameter,
comp_string);
if (result.Errors.Count > 0)
{
return false;
}
else
{
Assembly assembly = result.CompiledAssembly;
Type AType = assembly.GetType("ANameSpace.AClass");
MethodInfo method = AType.GetMethod("AFunc");
return Convert.ToBoolean(method.Invoke(null, null));
}
}