快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

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

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

我们还可以将编译的结果保存为一个真正的dll。且看下面的代码修改

cp.GenerateInMemory = false;
cp.OutputAssembly = "C:\\temp.dll";

有的朋友可能会疑惑,如果GenerateInMemory为true的话,是不是就真的不会 有程序集产生呢?其实不然,其实它仍然会有一个临时的dll,在%temp%目录下面 ,只不过使用完之后就被删除了。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号