下面介绍微软提供的编译器来编译并执行代码的过程,注意此编译器还 不支持C#高版,目前支持到C#6.0 。一些高级语法不要在代码里使用。例如 string 中的$。
以下代码展示了如何编译并执行代码。
private static void CodeCompiler(string args1, string root)
{
string revisionPath = Path.Combine(root, "Revision.cs");
string code = File.ReadAllText(revisionPath, System.Text.Encoding.UTF8);
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add(typeof(DirectoryInfo).Assembly.Location);
cp.ReferencedAssemblies.Add("System.Core.dll");
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
cp.TempFiles = new TempFileCollection(System.IO.Path.GetTempPath());
//lebang2020.cn
CompilerResults cr = codeProvider.CompileAssemblyFromSource(cp, code);
if (cr.Errors.HasErrors)
{
Exception ex = new Exception();
ex.Data["code"] = code;
throw ex;
}
else
{
//以下是我写的反射。可以直接使用你熟悉的方式替换
string revisionFullName = GetNameSpace(revisionPath) + ".Revision";
Assembly assebly = cr.CompiledAssembly;
Type type = assebly.GetType(revisionFullName);
MethodInfo methodInfo = type.GetMethod("Execute");
var instance = assebly.CreateInstance(revisionFullName, true);
System.Linq.Expressions.Expression instanceCast = System.Linq.Expressions.Expression.Constant(instance, type);
Type methodDelegateType = System.Linq.Expressions.Expression.GetActionType(methodInfo.GetParameters().Select(p => p.ParameterType).ToArray());
System.Linq.Expressions.ParameterExpression[] parameterExpression = methodInfo.GetParameters().Select(p => System.Linq.Expressions.Expression.Parameter(p.ParameterType)).ToArray();
System.Linq.Expressions.MethodCallExpression methodCall = System.Linq.Expressions.Expression.Call(instanceCast, methodInfo, parameterExpression);
var lambdaExpression = System.Linq.Expressions.Expression.Lambda(methodDelegateType, methodCall, parameterExpression);
var invoke = System.Linq.Expressions.Expression.Invoke(lambdaExpression, System.Linq.Expressions.Expression.Constant(args1), System.Linq.Expressions.Expression.Constant(root));
System.Linq.Expressions.Expression.Lambda<Action>(invoke).Compile()();
}
}
参考地址:
https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/compile-code-using-compiler