C#实现动态编译代码

/*------------------------------------------------------------------------------
 *  Copyright (C) 2013 
 *  版权所有。
 *  
 *  文件名:     Compile.cs
 *  功能說明:   
 *
 *  創建人:    it_Eric
 *  創建時間:   2013/10/25 16:19:52
 *   
 *  修改人:    
 *  修改說明:    
 * 
*-----------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.IO;
using System.Reflection;

namespace TestDemo
{
    public  class Compile
    {
        private string prefix = "using System;" +
            "public static class Driver" +
            "{" +
               "public static void Run()" +
               "{";
        private string postfix =
                "}" +
             "}";
        public string CompileAndRun(string input, out bool hasError)
        {
            hasError = false;
            string returnData = null;

            CompilerResults results = null;
            using (var provider = new CSharpCodeProvider())
            {
                var options = new CompilerParameters();
                options.GenerateInMemory = true;
                var sb = new StringBuilder();
                sb.Append(prefix);
                sb.Append(input);
                sb.Append(postfix);
                results = provider.CompileAssemblyFromSource(options, sb.ToString());
            }
            if (results.Errors.HasErrors)
            {
                hasError = true;
                var errorMessage = new StringBuilder();
                foreach (CompilerError error in results.Errors)
                {
                    errorMessage.AppendFormat("{0}{1}", error.Line, error.ErrorText);
                    returnData = errorMessage.ToString();
                }

            }
            else
            {
                TextWriter temp = Console.Out;
                var writer = new StringWriter();
                Console.SetOut(writer);
                Type drivertype = results.CompiledAssembly.GetType("Driver");
                drivertype.InvokeMember("Run", System.Reflection.BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null);

                Console.SetOut(temp);
                returnData = writer.ToString();

            }
            return returnData;
        }
                


    }
}

 

posted @ 2013-10-25 16:39  尼姑哪里跑  阅读(410)  评论(0)    收藏  举报