C# 动态编译代码

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();
            }
        }
    }
}

  

转载于:https://www.cnblogs.com/fanxp/p/5027259.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值