现在的位置: 首页 > 综合 > 正文

C# 动态编译及反射执行

2012年08月08日 ⁄ 综合 ⁄ 共 2634字 ⁄ 字号 评论关闭

#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)

抱歉!评论已关闭.