之前关于动态编译发了一贴:http://topic.csdn.net/u/20100408/10/6379abb7-2602-451e-a8f6-e085f06d141d.html解决方案如下:
using System; 
using System.Reflection; 
using System.Globalization; 
using Microsoft.CSharp;
using System.CodeDom; 
using System.CodeDom.Compiler;
using System.Text; namespace ConsoleApplication1 
{
    public class Program
      {
        static void Main(string[] 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());            if (cr.Errors.HasErrors)
              {
                  Console.WriteLine("编译错误:");
                foreach (CompilerError err in cr.Errors)
                  {
                      Console.WriteLine(err.ErrorText);
                  }
              }
            else
              {
                // 通过反射,调用HelloWorld的实例
                  Assembly objAssembly = cr.CompiledAssembly;
                object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
                  MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");                  Console.WriteLine(objMI.Invoke(objHelloWorld, null));
              }              Console.ReadLine();
          }        static string GenerateCode()
          {
              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 HelloWorld");
              sb.Append(Environment.NewLine);
              sb.Append("      {");
              sb.Append(Environment.NewLine);
              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();
              Console.WriteLine(code);
              Console.WriteLine();            return code;
          }
      }
}现在要将动态组织的方法:public string OutPut()
{
     return "Hello world!";
}改成:public string OutPut(string str)
{
     return str;
}在外面传递参数,从而达到编译一次,就能反复使用该方法的目的。求具体代码,顶者有分

解决方案 »

  1.   

    http://tech.sina.com.cn/s/2008-10-13/1311832905.shtml详解.NET中的动态编译
      

  2.   

    反射调用....
    Invoke传参数.google一搜一大把
      

  3.   

    using System; 
    using System.Reflection; 
    using System.Globalization; 
    using Microsoft.CSharp;
    using System.CodeDom; 
    using System.CodeDom.Compiler;
    using System.Text; namespace ConsoleApplication1 
    {
        public class Program
          {
            static void Main(string[] 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());            if (cr.Errors.HasErrors)
                  {
                      Console.WriteLine("编译错误:");
                    foreach (CompilerError err in cr.Errors)
                      {
                          Console.WriteLine(err.ErrorText);
                      }
                  }
                else
                  {
                    // 通过反射,调用HelloWorld的实例
                      Assembly objAssembly = cr.CompiledAssembly;
                    object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
                      MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");                  Console.WriteLine(objMI.Invoke(objHelloWorld, new object[]{"木哈哈"}));
                  }              Console.ReadLine();
              }        static string GenerateCode()
              {
                  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 HelloWorld");
                  sb.Append(Environment.NewLine);
                  sb.Append("      {");
                  sb.Append(Environment.NewLine);
                  sb.Append("          public string OutPut(string str)");
                  sb.Append(Environment.NewLine);
                  sb.Append("          {");
                  sb.Append(Environment.NewLine);
                  sb.Append("               return str;");
                  sb.Append(Environment.NewLine);
                  sb.Append("          }");
                  sb.Append(Environment.NewLine);
                  sb.Append("      }");
                  sb.Append(Environment.NewLine);
                  sb.Append("}");            string code = sb.ToString();
                  Console.WriteLine(code);
                  Console.WriteLine();            return code;
              }
          }
    }
      

  4.   

    如果改成数组呢?public string OutPut(string[] strs)
    {
      return strs.Tostring();
    }
      

  5.   

    Console.WriteLine(objMI.Invoke(objHelloWorld, new object[]{new string[]{"木哈哈","灭哈哈"}}));
      

  6.   

    可以用静态的,也可以做一个代理,不过代理的方法比较好,只需要运行一次,其它的地方想什么时候用就什么时候用,很方便,delegate
      

  7.   

    http://topic.csdn.net/u/20091208/10/2442E2A6-2DA8-4369-A399-BD1EBED8F48F.html