using System;
|
using System.Reflection;
|
using System.Globalization;
|
using Microsoft.CSharp;
|
using System.CodeDom;
|
using System.CodeDom.Compiler;
|
using System.Text;
|
|
namespace CodeProvider
|
{
|
public class CP
|
{
|
public static dynamic DoMethod(string code,string MethoName,object[] args)
|
{
|
// 1.CSharpCodePrivoder
|
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
|
|
// 2.ICodeComplier
|
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(code));
|
|
if (cr.Errors.HasErrors)
|
{
|
Console.WriteLine("编译错误:");
|
foreach (CompilerError err in cr.Errors)
|
{
|
Console.WriteLine(err.ErrorText);
|
}
|
return null;
|
}
|
else
|
{
|
// 通过反射,调用HelloWorld的实例
|
Assembly objAssembly = cr.CompiledAssembly;
|
if (MethoName== null)MethoName= "OutPut";
|
object methodInstanse = objAssembly.CreateInstance($"DynamicCodeGenerate.DynamicMethod");
|
MethodInfo objMI = methodInstanse.GetType().GetMethod(MethoName);
|
|
return objMI.Invoke(methodInstanse, args);
|
}
|
|
|
}
|
|
static string GenerateCode(string input=null)
|
{
|
|
|
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 DynamicMethod");
|
sb.Append(Environment.NewLine);
|
sb.Append(" {");
|
sb.Append(Environment.NewLine);
|
|
|
if (input != null)
|
{
|
sb.Append(input);
|
}
|
else
|
{
|
|
|
sb.Append(" public string OutPut()");
|
sb.Append(Environment.NewLine);
|
sb.Append(" {");
|
sb.Append(Environment.NewLine);
|
sb.Append(" return \"Hello world!\";");
|
sb.Append(Environment.NewLine);
|
sb.Append(" }");
|
sb.Append(Environment.NewLine);
|
|
}
|
|
sb.Append(" }");
|
sb.Append(Environment.NewLine);
|
|
sb.Append("}");
|
|
string code = sb.ToString();
|
|
|
return code;
|
}
|
}
|
}
|