利用CodeDom和反射动态编译并执行程序集

动态编译,听起来很酷,不是吗?

1.什么是动态编译

所谓动态编译是由两个字组成的:动态+编译。很显然,我们是想实现临时地 给出一段代码,然后将其编译成程序集(可以是在内存中,也可以是输出一个真 正的dll)

2.什么时候需要用到动态编译?

呃,这个问题有点难,简单地说,就是要动态的时候啦。呵呵。我们有的时候 需要提供系统这么一种灵活性,即有的类型没有办法预先写好,而是要根据情况 动态编译。这么说吧,例如我们希望根据数据库里面一个表的结构,动态编译出 来一个对应的类型。

3.如何使用动态编译。下面是一个很简单的例子

using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;

class Program
{
    static void Main(string[] args)
    {
        ICodeCompiler compiler = new CSharpCodeProvider ().CreateCompiler();//得到一个CSharp的编译器
        CompilerParameters cp = new CompilerParameters();
        cp.ReferencedAssemblies.Add("system.dll");
        cp.ReferencedAssemblies.Add ("system.data.dll");
        cp.ReferencedAssemblies.Add ("system.xml.dll");
        cp.GenerateExecutable = false;//这是指示说我们输出的程序 集是dll,而不是exe
        cp.GenerateInMemory = true; //这是指示在内存中创建该程序 集

        StringBuilder sb = new StringBuilder();
        sb.Append("using System; \n");
        sb.Append("public class MyClass{");
        sb.Append("public string HelloWorld(){");
        sb.AppendFormat("return {0};", "\"Hello,world\"");
        sb.Append("}}"); //这里为止,我们构造了一个动 态的类型,它有一个方法是HelloWorld

        CompilerResults result = compiler.CompileAssemblyFromSource(cp, sb.ToString()); //执行编译

        object _compilerobject = result.CompiledAssembly.CreateInstance("MyClass");

        MethodInfo method = _compilerobject.GetType().GetMethod ("HelloWorld");
        Console.WriteLine(method.Invoke(_compilerobject, null).ToString());

        Console.Read();
    }
}

时间: 2024-09-24 04:06:56

利用CodeDom和反射动态编译并执行程序集的相关文章

CodeDom系列五--动态编译

        继上节我们把Code 表达式编译成为了Code代码,有时我们只想动态编译程序集,在内存中或者是 硬盘上调用,这就是CodeDom的动态编译.微软在CodeDom中提供了动态编译程序,这是ICodeComp iler的用武之地了,它定义用于调用源代码编译的接口或使用指定编译器的 CodeDOM 树.可以从CodeDomProvider生成引用对象:CodeDomProvider.CreateProvider("").CreateCompiler();       在ICo

详解利用 JDK6 动态编译组件搭建 OSGi 运行时编译环境

但是我们知道,在开发 OSGi 环境下的 Bundle 时最麻烦的步骤之一就是搭建编译环境.即便利用 Eclipse 这样高效的 开发工具,由于 Bundle 个数的庞大以及同一 Bundle 的版本多样性,维护一个编译环境变得非常繁琐.常常我们需要对一 个 OSGi 的 Bundle 进行二次开发时,仅仅一个很小的改动都需要花大量的时间去搭建专为这套程序的编译环境.我们迫切 希望可以有一个运行时的编译环境来简化这些步骤,利用环境既有的依赖项来对代码进行编译. 本篇文章介绍 OSGi 的运行特性

.NET中的动态编译

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

详解.NET中的动态编译技术

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

详细介绍.NET中的动态编译技术_实用技巧

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

.NET 动态编译_实用技巧

这在很大程度上给我们提供了另外一种扩展的方式(当然这并不能算是严格意义上的扩展,但至少为我们提供了一种思路). 动态代码执行可以应用在诸如模板生成,外加逻辑扩展等一些场合.一个简单的例子,为了网站那的响应速度,HTML静态页面往往是我们最好的选择,但基于数据驱动的网站往往又很难用静态页面实现,那么将动态页面生成html的工作或许就是一个很好的应用场合.另外,对于一些模板的套用,我们同样可以用它来做.另外这本身也是插件编写的方式.   最基本的动态编译   .Net为我们提供了很强大的支持来实现这

动态编译JAVA程序

编译|程序|动态 在Sun JDK 1.2及后续版本中,包含了一组可在程序运行时刻编译和执行Java代码的API.这些API被包含在tools.jar类库中.这个功能允许Java程序在运行时动态编译.执行小的代码块,在有些情况下这个功能会让Java应用程序的架构更加灵活.开放. 本文假定读者已经在计算机中安装并配置好了Sun JDK 1.2或更高的版本,并对javac编译器命令有所了解. 在Java程序中使用编译器 假定要使用javac命令编译 /home/mytest目录下Test.java文

.NET的动态编译与WS服务调用详解

这篇文章介绍了.NET的动态编译与WS服务调用详解,有需要的朋友可以参考一下,希望对你有所帮助       动态编译与WS服务,有关系么?今天就乱弹一番,如何使用动态编译动态生成WS服务调用的代理类,然后通过这个代理类调用WS服务.     首先,动态编译这玩意在.NET里面是非常简单的,实际上只涉及到两个类型:CodeDomProvider以及CompilerParameters他们都位于System.CodeDom.Compiler命名空间.     以下代码可将源码动态编译为一个程序集:

.NET的动态编译与WS服务调用详解_实用技巧

    动态编译与WS服务,有关系么?今天就乱弹一番,如何使用动态编译动态生成WS服务调用的代理类,然后通过这个代理类调用WS服务.    首先,动态编译这玩意在.NET里面是非常简单的,实际上只涉及到两个类型:CodeDomProvider以及CompilerParameters他们都位于System.CodeDom.Compiler命名空间.    以下代码可将源码动态编译为一个程序集:动态编译 复制代码 代码如下: CodeDomProvider provider = CodeDomPro