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

  

时间: 2024-08-05 15:24:25

C# 动态编译代码的相关文章

程序动态编译代码

c#可以在程序运行过程中动态的编译代码,并生成程序集加载在内存,然后就可以动态的调用代码生成的程序了,这有点像我们的vs编译器,感兴趣的可以制作属于自己的c#编译器: 要实现这种功能,我们只需要调用CSharpCodeProvider就可以实现了: string prefix = "using System;"+ "public static class Test{"+ "public static void Run(){"; string po

让C#语言充当自身脚本!——.NET中的动态编译

原文:让C#语言充当自身脚本!--.NET中的动态编译 代码的动态编译并执行是.NET平台提供给我们的很强大的一个工具,用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序.这在很大程度上给我们提供了另外一种扩展的方式(当然这并不能算是严格意义上的扩展,但至少为我们提供了一种思路). 动态代码执行可以应用在诸如模板生成,外加逻辑扩展等一些场合.一个简单的例子,为了网站那的响应速度,HTML静态页面往往是我们最好的选择,但基于数据驱动的网站往往

分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧

原文:分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧 看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而JSON操作技巧则说明如何通过JPath来快速的定位JSON的属性节点从而达到灵活读写JSON目的. 一.JSON转换器(JsonConverter)使用及原理介

C#动态编译并执行代码

先来张运行时截图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.CSharp; using System.CodeDom.Compiler; u

如何用C#动态编译、执行代码

原文:如何用C#动态编译.执行代码 在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一.CSharpCodeProvider 提供对C#代码生成器和代码编译器的实例的访问.如果要动态生成VB代码,可以使用VBCodeProvider. CreateCompiler():获取编译器的实例. 二.ICodeCompiler 定义用于调用源代码编译的接口

ANGULARJS 动态编译添加到dom中

在使用angularjs 时,希望通过动态构建angular模版,再通过angular进行展示. 使用 方法如下: <html ng-app="app"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <script src="assets/angular.min.js">

浅谈VB.Net 程序的编译和动态编译

---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译vb.net程序的真正原理. 这篇随笔包含如下几个部分: 1.VS是怎么编译的 2.通过vbc.exe来编译应用程序 3.在代码中通过VBCodeProvider动态编译应用程序 ok,首先来说说vs编译应用程序的方法.其实,vs是通过调用vbc.exe来编译vbnet应用程序的.vs把用户编写的代

如何根据动态SQL代码自动生成DTO

当前的状况 一般做数据库相关开发, 除非学习, 否则很少有人愿意直接使用JDBC.本来Java代码就比较啰嗦了,而直接用JDBC写代码之啰嗦简直有些令人发狂!所以在实际开发过程中,我们通常都会使用一些框架/库来帮助我们操作数据库.而且开源市场上的选择也比较多,就我个人接触到的有:Hibernate,MyBatis,JdbcTemplate,DbUtils,ActiveRecord,JavaLite等等. 这些框架都能大幅的提高开发效率,对于一些基本CRUD操作来说,虽然各有差异,但总的来说基本是

动态编译

动态编译.NET代码 分为VB和C#两种 Private Sub BuidSub(OneSource As String, OneRef As String, OneExt As String, OneSub As String, OneClass As String) Dim strSourceCode As String = OneSource Dim objCSharpCodePrivoder As New CSharpCodeProvider() Dim objVBCodePrivode