C# 动态编译及反射执行
#region 程序集1 无参数、静态类下的静态方法
-
static void CodeAssembly_1() {
//提供对 C# 代码生成器和代码编译器的实例的访问。
CSharpCodeProvider provider = new CSharpCodeProvider();
//表示用于调用编译器的参数
CompilerParameters parameter = new CompilerParameters();
//获取当前项目所引用的程序集。
parameter.ReferencedAssemblies.Add("System.dll");
//获取或设置一个值,该值指示是否生成可执行文件。
parameter.GenerateExecutable = false;
//获取或设置一个值,该值指示是否在内存中生成输出。
parameter.GenerateInMemory = true;
//使用指定的编译器设置,从包含源代码的字符串的指定数组,编译程序集。返回编译结果。
CompilerResults result = provider.CompileAssemblyFromSource(parameter, GetCode_1("120/12"));//将你的式子放在这里
//获取编译器错误和警告的集合
if (result.Errors.Count > 0) {
Console.WriteLine("动态编译出错了!");
} else {
//获取或设置已编译的程序集。
Assembly assembly = result.CompiledAssembly;
//获取当前实例的 Type
Type AType = assembly.GetType("NameSpace_1.Class_1");
//获取类型的方法
MethodInfo method = AType.GetMethod("Func");
//调用方法
Console.WriteLine(method.Invoke(null, null));
}
Console.Read();
}
//获取代码
private static string GetCode_1(string para) {
StringBuilder codes = new StringBuilder();
//引用
codes.Append("using System; ");
//命名空间定义
codes.Append("namespace NameSpace_1");
codes.Append("{");
//类定义
codes.Append(" public class Class_1");
codes.Append(" {");
//方法定义
codes.Append(" public static object Func()");
codes.Append(" {");
codes.Append(" return (" + para + ");");
codes.Append(" }");
codes.Append(" }");
codes.Append("}");
return (codes.ToString());
}
#endregion
#region 程序集2 含构造函数类需要生成实例对象后调用还参数方法
static void CodeAssembly_2() {
//提供对 C# 代码生成器和代码编译器的实例的访问。
CSharpCodeProvider provider = new CSharpCodeProvider();
//表示用于调用编译器的参数
CompilerParameters parameter = new CompilerParameters();
//获取当前项目所引用的程序集。
parameter.ReferencedAssemblies.Add("System.dll");
//获取或设置一个值,该值指示是否生成可执行文件。
parameter.GenerateExecutable = false;
//获取或设置一个值,该值指示是否在内存中生成输出。
parameter.GenerateInMemory = true;
//使用指定的编译器设置,从包含源代码的字符串的指定数组,编译程序集。返回编译结果。
CompilerResults result = provider.CompileAssemblyFromSource(parameter, GetCode_2());
//获取编译器错误和警告的集合
&nb