using System;
 using System.Text;
 using System.CodeDom.Compiler;
 using System.Reflection;
 using Microsoft.CSharp;
 namespace ToolPackages.CodeDomProvider
 {
 public class SampleCodeDomProvider
  {
   //代码生成器对象
   private static System.CodeDom.Compiler.CodeDomProvider comp = new  CSharpCodeProvider();
   //编译器参数
   private static CompilerParameters cp = new CompilerParameters();
   private object curObj;
   public bool Compile(string codes)
   {
    StringBuilder codeBuilder = new StringBuilder();
    //完成待编译的代码构建工作,可移动到调用层构建
    codeBuilder.Append("using System;");
    codeBuilder.Append("using Microsoft.JScript;");
    codeBuilder.Append("public class Sharpnessdotnet{");
    codeBuilder.Append(codes);
    codeBuilder.Append("}");
    //完成编译器参数的初始化
    //1.引用的程序集
    cp.ReferencedAssemblies.Add("System.dll");
    cp.ReferencedAssemblies.Add("Microsoft.JScript.dll");
    //2.仅在内存中生成
    cp.GenerateExecutable = false;
    cp.GenerateInMemory = true;
    
    string code = codeBuilder.ToString();
    //利用编译器参数设置和构建的代码进行编译工作
    CompilerResults cr = comp.CreateCompiler().CompileAssemblyFromSource(cp, code);
    //判断是否编译成功
    if (cr.Errors.HasErrors)
    {
     return false;
    }
    else
    {
     //获取编译成功的程序集
     Assembly a = cr.CompiledAssembly;
     //从程序集中获取指定类型
     System.Type type = a.GetType("Sharpnessdotnet");
     //调用其默认构造函数,返回一个实例
     curObj = type.GetConstructor(new Type[0]).Invoke(null);
     return true;
    }
   }
   //调用指定成员
   public object InvokeMember(string member,System.Reflection.BindingFlags flags,params object[] parameters)
   {
    if(curObj!=null)
    {
     return  curObj.GetType().InvokeMember(member,flags,null,curObj,parameters);
    }
    else
    {
     throw new Exception("please compile first.");
    }
   }
  }
 }
 
//调用实例部分
using System;
 using System.IO;
 using System.Collections;
 using System.Text;
 using System.Data;
 using ToolPackages.CodeDomProvider;
 namespace ToolPackages
 {
  class Application
  {
   /// <summary>
   /// 应用程序的主入口点。
   /// </summary>
   [STAThread]
   static void Main(string[] args)
   {
    SampleCodeDomProvider myCoder = new SampleCodeDomProvider();
    StringBuilder codes = new StringBuilder();
    codes.Append("public void sayHello()");
    codes.Append("{");
    codes.Append("Console.WriteLine(/"hello world.../");");   
    codes.Append("}");
    codes.Append("public static void saySomething(string message)");
    codes.Append("{");
    codes.Append("Console.WriteLine(message);");   
    codes.Append("}");
    myCoder.Compile(codes.ToString());
    myCoder.InvokeMember("sayHello",System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod,null);
    myCoder.InvokeMember("saySomething",System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod,new object[]{"my name is sharpnessdotnet,i love system analyse."});
    Console.Read();   
   }  
   
   
  }
  
 }