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

      

  • 相关阅读:
    win+ubuntu双系统安装后无法进入win7解决方法
    dell笔记本重装系统
    Linux下文件重命名、创建、删除、修改及保存文件
    个人网站
    如何给网页标题添加icon小图标
    CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示
    WIN10 通过Console连接交换机
    linux各文件夹的作用
    API设计指南(译)
    Petri网的工具
  • 原文地址:https://www.cnblogs.com/fanxp/p/5027259.html
Copyright © 2020-2023  润新知