码迷,mamicode.com
首页 > Windows程序 > 详细

C# 动态编译代码

时间:2015-12-07 20:43:55      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:

C# 动态编译代码:

公共辅助类,有注释就不废话了。

using System;
using System.Text;
using System.Reflection;
using System.CodeDom.Compiler;

namespace DynamicCompilation.Compilation
{
    /// 
    /// 编译返回结果
    /// 
    public class CompilationReturn
    {
        /// 
        /// 程序集 
        /// 
        public Assembly Assembly { get; set; }

        /// 
        /// 编译错误列表
        /// 
        public CompilerErrorCollection Errors { get; set; }

        /// 
        /// 编译结果,如果编译成功Errors==null||编译失败Assembly==null
        /// 
        public Boolean CompilationResults { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom.Compiler;

namespace DynamicCompilation.Compilation
{
    /// 
    /// C#源码操作,主要包括动态生成dll,动态加载dll
    /// 
    public class SourceOperating
    {
        /// 
        /// 动态编译C#代码,但不会保存dll到本地
        /// 
        /// 编译内容
        /// 预先加载的dll
        /// 编译结果
        public static CompilationReturn SourceCompiler(String strClass, params String[] dllParam)
        {
            return SourceCompiler(strClass, null, dllParam);
        }

        /// 
        /// 动态编译C#代码
        /// 
        /// 编译内容
        /// dll保持地址
        /// 预先加载的dll
        /// 编译结果
        public static CompilationReturn SourceCompiler(String strClass, String savePath, params String[] dllParam)
        {
            //设置需要编译的语言类型
            CodeDomProvider _p = CodeDomProvider.CreateProvider("C#");

            //编译参数对象
            CompilerParameters parameter = new CompilerParameters();

            //预先加载编译时需要的dll文件
            foreach (String str in dllParam)
            {
                parameter.ReferencedAssemblies.Add(str);
            }
            //判断是否需要将dll文件保存到本地
            if (!String.IsNullOrEmpty(savePath))
                parameter.OutputAssembly = savePath;

            parameter.GenerateExecutable = false;
            parameter.GenerateInMemory = false;
            //dll编译
            var _result = _p.CompileAssemblyFromSource(parameter, strClass);

            CompilationReturn result = null;

            if (_result.Errors.HasErrors)
            {
                //将错误抛出
                return result = new CompilationReturn()
                {
                    CompilationResults = false,
                    Errors = _result.Errors
                };
            }
            else
            {
                //将编译结果返回
                return result = new CompilationReturn()
                {
                    CompilationResults = true,
                    Assembly = _result.CompiledAssembly
                };
            }
        }
    }
}

  

动态编译测试代码,这是一个文本文件:
using System;
using System.Text;

namespace DynamicCompilation
{
    public class Code
    {
        public void Hello()
        {
            Console.WriteLine("这是动态编译出来的");
        }
    }
}

  

测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using DynamicCompilation.Compilation;

namespace DynamicCompilation
{
    class Program
    {
        static void Main(string[] args)
        {
            //读取需要编译的代码
            StreamReader objReader = new StreamReader("Code.txt");
            String code = objReader.ReadToEnd();

            //动态编译
            CompilationReturn result = SourceOperating.SourceCompiler(code, (new List() { "System.dll" }).ToArray());

            if (!result.CompilationResults)
            {
                //编译出错 抛出编译错误信息
                foreach (var error in result.Errors)
                {
                    Console.WriteLine(error.ToString());
                }
            }
            else
            {
                //实例化对象
                dynamic obj = result.Assembly.CreateInstance("DynamicCompilation.Code");
                //调用对象的方法
                obj.Hello();
            }
        }
    }
}

  

C# 动态编译代码

标签:

原文地址:http://www.cnblogs.com/fanxp/p/5027259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!