第12章 动态代码生成和编译技术

转载 2006年06月04日 19:31:00

第12章   动态代码生成和编译技术

在后面的讨论中会涉及到一些关于动态代码生成的技术,因此,有必要先在这里对这个技术做一个介绍。

关于动态代码生成和编译的技术,在Java.Net中都有所支持。在Java平台之上,有JDK自己的tools.jar提供的功能,也可以通过一些第三方的字节码增强器来实现。但就这方面的技术来说,.Net提供的解决方案是最完整和成体系的。在这里,主要介绍.Net平台下的动态代码生成和编译技术。

.Net平台下,有两种技术来实现动态代码生成和编译,分别是EmitCodeDom,下面,我们就这两种技术来做一些简单的介绍。

12.1 Emit

 

12.2 CodeDom

CodeDOM的中文名就是“代码文档对象模型”,使用这套模型,可以使编写源代码的程序的开发人员可以在运行时,根据表示所呈现代码的单一模型,用多种编程语言生成源代码,并且可以动态编译和运行所生成的代码。

为表示源代码,CodeDOM 元素相互链接以形成一个数据结构(称为 CodeDOM 图),它以某种源代码的结构为模型。System.CodeDom 名称空间定义可以表示源代码的逻辑结构(与具体的编程语言无关)的类型。System.CodeDom.Compiler 名称空间定义从 CodeDOM 图生成源代码的类型,和在受支持的语言中管理源代码编译的类型。编译器供应商或开发人员可以扩展受支持语言的集合。

.NET Framework 中包含了C#JScript Visual Basic 的代码生成器和代码编译器。开发人员也可以通过扩展System.CodeDom.Compiler 名称空间来实现自己的代码生成器和代码编译器。

使用CodeDom来动态生成代码和编译的过程一般是:

1.   使用CodeCompileUnit定义一个可编译的单元

2.   使用CodeNamespace 定义一个名称空间,并把这个名称空间加入上面定义的可编译单元

3.   使用CodeTypeDeclaration定义一个类,并把这个类加入上面定义的名称空间

4.   使用CodeTypeMember的具体子类,例如CodeMemberField或者CodeMemberMethod为上面的类定义成员变量或者方法

5.   使用CodeExpression定义某个方法中具体代码的调用


6.   如果需要,可以通过某个具体的CodeDomProvider来生成源代码,例如,可以使用CSharpCodeProvider为上面的结构生成具体的C#代码。

7.   通过CodeCompiler将上面的代码树编译成可执行的文件。

 

下面的例子展示了使用CodeDom生成一个HelloWorld程序的例子。生成以后的代码应该是这个样子的:

using System;

 

namespace Sample

{

    public class DemoClass

    {

    static void Main(string[] args)

      {

    System.Console.WriteLine("Hello World!");

    }

    }

}

生成程序的代码如下:

public void GenerateCode()

{

 

    //生成一个可编译的单元,这是最根部的东西

    CodeCompileUnit compunit = new CodeCompileUnit();

    //定义一个名为Sample的命名空间

    CodeNamespace sample = new CodeNamespace("Sample");

    compunit.Namespaces.Add(sample);

    sample.Imports.Add(new CodeNamespaceImport("System"));//导入System命名空间

    //定义一个名为DemoClass的类

    CodeTypeDeclaration MyClass = new CodeTypeDeclaration("DemoClass");

    sample.Types.Add(MyClass);

    //定义程序入口点,就是Main()

    CodeEntryPointMethod Start = new CodeEntryPointMethod();

    MyClass.Members.Add(Start);

    //下面产生调用方法的语句,//这句会产生如下的C#代码System.Console.WriteLine("Hello World!");

    CodeMethodInvokeExpression cs = new CodeMethodInvokeExpression

    (new CodeTypeReferenceExpression("System.Console"),

    "WriteLine", new CodePrimitiveExpression("Hello World!"));

    Start.Statements.Add(cs);

 

    //根据CodeDOM产生程序代码,代码文件就是DemoClass.cs,这里生成C#代码  

    CSharpCodeProvider cprovider = new CSharpCodeProvider();

    ICodeGenerator gen = cprovider.CreateGenerator();

    StreamWriter sw = new StreamWriter("DemoClass.cs", false);

    gen.GenerateCodeFromCompileUnit(compunit, sw, new CodeGeneratorOptions());

    sw.Close();

 

    //编译源代码

    ICodeCompiler compiler = cprovider.CreateCompiler();

    //编译参数

    CompilerParameters cp = new CompilerParameters(new string[] { "System.dll" },

    filepath.Substring(0, filepath.LastIndexOf(".") + 1) + "exe", false);

    cp.GenerateExecutable = true;//生成EXE,不是DLL

    CompilerResults cr = compiler.CompileAssemblyFromDom(cp, compunit);

}

 

上面只是一个很简单的例子,通过CodeDom,可以生成任何复杂的程序。

【读书笔记】《数字图像处理》(第三版)[刚萨雷斯]-第12章 目标识别

目标识别、分类器、神经网络的基本概念。
  • u014556728
  • u014556728
  • 2016年09月20日 22:26
  • 651

JS DOM 编程艺术(第2版)读书笔记 第12章 综合示例

/** * addLoadEvent */ function addLoadEvent(func) { var oldonload = window.onload; if(type...
  • trr1994917
  • trr1994917
  • 2015年05月17日 10:37
  • 396

c++ Primer Plus(第六版)第十二章习题,写代码之路

c++ Primer Plus(习题12.1) //12.1头文件 #pragma once #ifndef COW_H #define COW_H #include #include class ...
  • Robot_x
  • Robot_x
  • 2017年01月20日 13:01
  • 493

python核心编程-第12章课后练习答案

第一题: 路径搜索和搜索路径。路径搜索和搜索路径之间有什么不同? 解答:前者是指查找某个文件的操作,后者是去查找一组目录。 第二题: 导入属性。假设你的模块mymodule里有一个foo()函...
  • qq_34171520
  • qq_34171520
  • 2016年10月31日 12:04
  • 702

《Python核心编程》第12章 习题

12–5. 使用 __import__(). (a) 使用 __import__ 把一个模块导入到你的名称空间。 你最后使用了什么样的语法? (b) 和上边相同, 使用 __import__() 从...
  • birdzb
  • birdzb
  • 2016年02月23日 22:19
  • 1012

c++ primer plus(第6版)中文版 第十二章编程练习答案

第十二章编程练习答案
  • gd275313
  • gd275313
  • 2014年05月18日 17:05
  • 1580

编程珠玑第12章习题

1  产生[m,n]范围内的随机整数
  • wordwarwordwar
  • wordwarwordwar
  • 2014年11月13日 10:13
  • 298

iPhone开发基础教程笔记(十二)--第十二章 使用Quartz和OpenGL绘图

第十二章 使用Quartz和OpenGL绘图 有时应用程序需要能够自定义绘图。一个库是Quartz 2D,她是Core Graphics框架的一部分;另一个库是OpenGL ES,她是跨平台的图...
  • niejiafa_131
  • niejiafa_131
  • 2015年11月22日 11:06
  • 439

[完]机器学习实战 第十二章 使用FP-growth算法来高效发现频繁项集

本章内容 发现事物数据中的公共模式 FP-growth算法 发现Twitter源中共现词 搜索引擎自动补全查询此项,可以找出互联网上经常一块出现的词对。这需要一种高效发现频繁项集的方法。FP-grow...
  • namelessml
  • namelessml
  • 2016年10月20日 13:35
  • 1160

C++ Primer Plus第六版 第十二章 编程练习答案

开学到现在写了一堆代码 然而懒得写博客发2333333 AHU今年最长寒假40多天简直爽cry 话说今晚C++实验期末考试啊= = 最近一直在写各科实验的代码 还有自己论文的东西。。。这本书的题目都没...
  • zhaoshu01234
  • zhaoshu01234
  • 2015年11月19日 16:48
  • 1467
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第12章 动态代码生成和编译技术
举报原因:
原因补充:

(最多只允许输入30个字)