• 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

    (注:摘自:http://www.2cto.com/kf/201008/54519.html)

  • 相关阅读:
    深入浅出设计模式——命令模式(Command Pattern)
    深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)
    深入浅出设计模式——代理模式(Proxy Pattern)
    深入浅出设计模式——享元模式(Flyweight Pattern)
    深入浅出设计模式——外观模式(Facade Pattern)
    perl字符串操作符
    perl中单引号和双引号字符串区别
    用例图详解
    perl中system函数和反引号` `使用区别
    window cmd命令行下执行perl语句
  • 原文地址:https://www.cnblogs.com/Shaina/p/2539890.html
Copyright © 2020-2023  润新知