VB.NET动态编译(一)

VB.NET 动态编译(一)

目录

(一) CodeDom 是什么

(二) VB.NET 的动态编译实现

(三) 如何动态执行自己的代码

(四) 如何动态生成自己的 DLL

(五) 如何动态生成自己的 EXE

(六) 通过接口来实现高级调用

** CodeDom ** ** 是什么? **

大家都知道, .NET 的所有语言,最终都编译成为 IL 来执行。 IL 的指令集是一种公开的,平台无关的语言。从理论上,任何人都可以写出 IL 代码的编译器,来把自己的语言编译为 IL 语言。只要知道 IL 指令集和 .NET PE 文件的结构就可以。

但是这里面存在一个问题。 .NET Framework 在不断的升级, IL 的指令集可能发生变化。可能会有新的,经过优化的指令来替代老的指令。比如新出现了 MMX , 3DNOW 之类的技术。微软可以通过优化 IL 编译器来让 IL 支持新的 CPU 指令集。同时,也许会推出新的 IL 指令集来直接支持新的技术。 那么,如何让编译器能够自动适应并产生相应的优化代码?

作为 .NET 的开发商,微软提出了 .NET 下的通用编译接口 (CodeDom) 。任何语言的开发商,只要实现了这个接口,就可以实现这个目的。

CodeDom 把“语法分析”和“ IL 编译”分开来实现了这个目的。举一个例子来说, VB.NET 的编译器,它的编译原理应该是这样的:

1. VB.NET 编译器读入源代码并进行有效性分析

2. 编译器把源代码翻译为“定义变量”、“方法定义开始(结束)”、“ IF 分支判断”、“调用方法”之类的抽象的底层方法调用(注意,并不是 IL 语言)。这些方法都在 CodeDOM 中定义。 *

3. 编译器调用 CodeDom 的内置引擎,把这些方法编译成为 IL 代码。

你可以在 ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpgenref/html/cpconcodedomquickreference.htm 找到 CodeDom 中的常用定义。

好了,到现在,你已经知道了 VB.NET 的编译原理了。不知道大家有没有注意到, VS.NET 的所有语言,都在一个 IDE 内工作。那么,微软又是如何实现在一个 IDE 内部,集成了多个语法工具呢?答案就是: MS 通过一组特定的接口来实现。

CodeDom 内置了一系列的接口和基类,通过继承(基类)和实现(接口),就可以实现一个你自己的语法分析器。在 System.CodeDom.Compiler 命名空间中,你可以看到这些基类和接口。如果你想写自己的 Pascal 编译器,只要实现这些接口,然后写上一大堆 VS.NET IDE 的扩展模块,就可以让 VS.NET 来变成 Delphi.NET 了 J

有趣的是,微软其中还包括了一个 ICodeGenerator 接口,我不太清楚微软为什么要定义这个接口,可能是为了调试器的需要。 MSDN 上说这个接口的目的用于将 IL 代码反向为自然代码。也就是说,如果编译器实现了这个代码,就可以把 IL 代码变成该编译器所支持的代码。通过这个接口我们可以将 IL 代码反向为 VB 代码( VB 的编译器实现了该接口, C# 的我不清楚,应该也实现了该接口)。

  • 这样写只是为了便于理解。实际上并不完全是这样,是结构化的。

Ps: 这些东西只是我一个晚上研究 CodeDOM 的成果,如果你觉得和你的了解有所冲突,欢迎拍砖

Published At
Categories with Web编程
Tagged with
comments powered by Disqus