使用C# 2.0实现语言无关的代码生成器
概述
使用C# 2.0实现语言无关的代码生成器
一、什么是CodeDom?
现 在的程序规模越来越大,虽然在计算发展的几十年间,产生了许多快捷、高效的编程语言和开发工具,如C#、Visual Studio、java等。也产生了许多用以辅助软件设计、开发的思想和方法,如UML、OOP、Agile等。尽管利用这些技术和方法可以大大提高程序 编写的效率,但是仍可能有重复的编码工作。因此,现在出现了许多可以自动产生源代码或者目标文件的软件,即Code Wizards。
一般这些Code Wizards在生成源代码时都是通过设置模板文件,然后根据这些模板文件生成源代码。有很多Code Wizards只能生成固定的语言(如java、C#等)。虽然有一些Code Wizards可以生成多种语言,但也只是固定的几种。而且生成源代码部分都是显示地固定在程序中。这样非常不易扩展。如CodeSmith系统,这是一 个非常不错的Code Wizard。它使用一个扩展名为cst的文件来设置模板。这个模板文件的格式类似于Asp.net。如果想生成C#源代码,必须要在其中显示地标明,并 且模板的固定部分要使用C#语言编写。如果这样的话,同样功能要生成不同语言的代码,如C#和VB.net。就要编写两个模板文件。这是非常不方便的。 从以上的描述来看, Code Wizard所面临的一个重要问题就是如何使用一个模版文件来生成不同语言的源代码。幸好Microsoft提供了一种解决方案,这就是CodeDOM技 术。CodeDOM的全称是代码文档对象模型(Code Document Object Model)。整个CodeDOM就是一张对象图(object graph)。它用这张图中的所有对象描述了面向对象语言中的几乎所有的语法现象,如类、接口、方法、属性等。CodeDOM通过对象模型对语言进行了抽象,然后利用具体语言所提供的生成源代码的机制来生成源代码,并可调用相应的编译器将源码生成*.dll或*.exe。从而可以达到与语言无关的目的。图1描述了使用CodeDOM 生成和编译源代码的过程。 图1 CodeDom生成和编译源代码的过程 从上图可以看出,CodeWizard只使用CodeDOM对语言进行抽象,然后通过CodeDomProvider生成源代码。最后通过编译器生成中间语言。下面将详细讨论如何利用CodeDOM来实现CodeWizard。
初来贵宝地,请多关照哈
| |
查看详细资料 |
TOP
免费免杀空间[点击申请,免费名额有限]
|
wolaile
经理
|
2#
大
中
小 发表于 2008-5-11 10:36
只看该作者
【MS08067全自动多段循环抓鸡器】
二、实现CodeWizard
下面要实现的这个CodeWizard非常简单。其功能主要是将一个数据表映射成一个类。这个类提供了Add和Save方法以及和数据表的每个字段相对应 的属性。使用这个类可以向数据表添加记录。为了便于描述,将这个数据表保存成xml文件格式。每条记录为一个item结点,每一个字段为这个结点的一个属 性。表名为这个xml文件的根结点名称。这个xml文件的格式如下所示: <MyTable> <item id = "01" name = "Bill"/> <item id = "02" name = "Mike" /> </MyTable> 这个CodeWizard通过一个模板文件来定义数据表的结构。模板文件的格式如下: <MyTable> <id type = "System.Int32"/> <name type = "System.String"/> </MyTable> 其中type为字段的类型,它的值是在.net framework中的System中定义的简单类型,如System.Int32、System.String、System.Char等。下面就详细 讨论如何利用这个模板文件和CodeDOM技术来生成C#和VB.net的源代码。 CodeDOM的结构 CodeDOM由两部分组成: 1. 用于描述抽象代码结构的一组类。其中CodeCompileUnit类是这些类的根。代表一个源码文件(如C#的*.cs和VB.net的*.vb)。在 使用CodeDOM时,必须先建立一个CodeCompileUnit类的对象,然后在这个对象中加入必要的namespace、class等面向对象元 素。 2. 用于生成和编译源代码的类。这个类必须从CodeDomProvider类继承。每种.net framework 所支持的语言都有自己的CodeDomProvider类。如在C#中的CodeDomProvider类叫CSharpCodeProvider,而在VB.net中叫VBCodeProvider。
初来贵宝地,请多关照哈
|
查看详细资料 |
TOP
免费免杀空间[点击申请,免费名额有限]
|
wolaile
经理
|
3#
大
中
小 发表于 2008-5-11 10:36
只看该作者
【MS08067全自动多段循环抓鸡器】
三、数据表类的定义
要用CodeDOM定义一个类需要三步: 1. 建立一个CodeCompileUnit对象。这个类相当于一个源码文件。 2. 建立一个CodeNamespace对象。理论上在.net framework上运行的程序语言,如C#、VB.net 等,可以没有namespace。但在CodeDOM中必须使用这个类,如果不想要namespace,可以将namespace的名字设为 null或空串。 2. 建立一个CodeTypeDeclaration对象。这个类可以建立Class和Interface两种Type。在 这个例子中只建立Class。如果想建立Interface,只需将IsInterface属性设为true即可。 主要的实现代码如下: private CodeCompileUnit m_CodeCompileUnit;private CodeNamespace m_CodeNameSpace;private CodeTypeDeclaration m_Class;private
全局变量的生成 这个数据表类中有四种全局变量:用于操作xml文件的类型为XmlDocument的变量、用于保存数据表文件名的变量、用于确定是否为加入状态的Boolean型变量、以及用于保存每个字段值的变量组。具体实现代码如下: using System.CodeDom; using System.CodeDom.Compiler; 1
初来贵宝地,请多关照哈
|
查看详细资料 |
TOP
免费免杀空间[点击申请,免费名额有限]
|
wolaile
经理
|
4#
大
中
小 发表于 2008-5-11 10:37
只看该作者
【MS08067全自动多段循环抓鸡器】
四、属性的生成
在数据表类中每个属性代表数据表的一个字段,名子就是字段名。这些属性和保存字段的全局变量一一对应。下面是具体的实现代码: 构造函数的生成 构造函数的主要工作是打开数据表。如果数据表不存在,就创建这个数据表文件。在编写代码之前,需要先定义三个全局变量。因为这三个全局变量在程序中会多次 用到。它们的类型都是CodeVariableReferenceExpression。这个类型变量其实在生成源码中的作用就是对某一个变量的引用。具 体的实现代码如下: private CodeVariableReferenceExpression m_XmlFileExpression;private CodeVariableReferenceExpression m_XmlExpression;private CodeVariableReferenceExpression m_AddFlagExpression;privatevoid InitVariants(){m_XmlFileExpression = new CodeVariableReferenceExpression("m_XmlFile");m_XmlExpression = new CodeVariableReferenceExpression("m_xml");m_AddFlagExpression = new CodeVariableReferenceExpression("m_AddFlag");} 下面是生成构造函数的源代码: Add和Save方法生成 Add方法只有一条语句,功能是将m_AddFlag设为true,以使数据表类处于加入状态。Save方法比较复杂。它的功能是当m_AddFlag为true时在数据表文件的最后加入一条记录,并保存。具体实现代码如下: private
初来贵宝地,请多关照哈
|
查看详细资料 |
TOP
免费免杀空间[点击申请,免费名额有限]
|
wolaile
经理
|
5#
大
中
小 发表于 2008-5-11 10:37
只看该作者
【MS08067全自动多段循环抓鸡器】
五、生成源代码
生成具体语言的源代码需要一个从CodeDomProvider继承的类。对于C#而言是CSharpCodeProvider类。实现代码如下: using Microsoft.CSharp;public 编译源代码 到现在为止,这个数据表类的源代码已经全部生 成了。你可以将这个源文件直接加入到自己的工程中。或者直接将其编译成*.dll文件,然后在程序中调用。如果想编译,可以直接调用指定语言的编译器(如 C#中的csc.exe)。但这样不是太方便。在CodeDOM中提供了一种机制,可以在程序中通过CodeDomProvider直接调用指定语言的编 译器。下面是编译C#源程序的一个例子。
public
作为一个参数,表示目标文件需要调用这个dll中的资源。
结束语 我花了一个晚上的时间实现了这个简单的例子,并用C#2.0调试通过,只是为了抛砖引玉。自动生成源代码有很多的方法,但使用CodeDom生成源代码会有更大的灵活性,主要表现在以下三个方面: 1. 就可以生成这种语言的源代码。 2. 因为当这种语言的语法有所变化时,CodeDomProvider也会随之升级。因此,使用CodeDOM的Code Wizards也会随着CodeDOM而升级,这样就不必修改Code Wizards的源代码了。 3. 法,才能生成它的源代码。而使用CodeDOM却可以避免这一点。因为CodeDOM是使用抽象的object graph来描述语言的。而语言的具体语法是由CodeDomProvider所决定的。
其实CodeDOM不仅可以用在Code Wizards上,也可以用在许多其它地方,如可以生成Web Services的客户端代理(Client Proxies),或根据UML图生成类的构架代码。总之,使用CodeDom可以大大降低和语言的偶合度,并且很容易维护和升级系统
初来贵宝地,请多关照哈
|
最后
以上就是高挑溪流为你收集整理的使用C# 2.0实现语言无关的代码生成器的全部内容,希望文章能够帮你解决使用C# 2.0实现语言无关的代码生成器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
- 本文分类:语言
- 浏览次数:72 次浏览
- 发布日期:2024-07-25 17:40:01
- 本文链接:https://www.kaopuke.com/article/k-p-k_13_u_7_o_18_f1_14__23__2_z.html
发表评论 取消回复