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());
            //获取编译器错误和警告的集合
            if (result.Errors.Count > 0)
            {
                Console.WriteLine("动态编译出错了!");
            }
            else
            {
                //获取或设置已编译的程序集。
                Assembly assembly = result.CompiledAssembly;
               
                //获取当前实例的 Type
                Type AType = assembly.GetType("NameSpace_2.Class_2");

                //动态生成类的实例  含构造函数调用
                object assemblyObject = System.Activator.CreateInstance(AType, 100);

                //获取类型的方法
                MethodInfo method = AType.GetMethod("Plus");

                //调用方法
                object[] methodParameters = new object[2];
                methodParameters[0] = 5.5;
                methodParameters[1] = 4.5;
                //由于是调用类方法,因此需要指定类实例和方法参数。
                Console.WriteLine(method.Invoke(assemblyObject, methodParameters));
            }
            Console.Read();
        }

        //获取代码
        private static string GetCode_2()
        {
            StringBuilder codes = new StringBuilder();
            //引用
            codes.Append("using System; ");
            //命名空间定义
            codes.Append("namespace NameSpace_2");
            codes.Append("{");
            //类定义
            codes.Append("  public class Class_2");
            codes.Append("  {");
            //私有成员定义
            codes.Append("      private double c = 0.0;");
            //构造函数定义
            codes.Append("      public Class_2(double c)");
            codes.Append("      {");
            codes.Append("          this.c = c;");
            codes.Append("      }");
            //方法定义
            codes.Append("      public double Plus(double a, double b)");
            codes.Append("      {");
            codes.Append("          return (a + b + c);");
            codes.Append("      }");

            codes.Append("  }");
            codes.Append("}");

            return (codes.ToString());
        }

        #endregion

你可能感兴趣的:(动态编译)