冬Blog

醉心技术、醉心生活
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

[SPLEB]CodeSmith原理剖析(1)

Posted on 2006-02-04 14:58  冬冬  阅读(2175)  评论(0编辑  收藏  举报
  本文介绍了在SPLEB(http://yuandong.cnblogs.com/archive/2006/02/01/324647.html开发过程中,对CodeSmithAPI调用的一些研究,分析代码生成的技术。最终可以在我们自己的程序中调用CodeSmith API作为代码生成的基础。本文假设读者已经可以熟练的使用CodeSmith编写模板并且批量生成代码,且了解代码的动态编译。

 

一,         CodeSmtih的代码生成原理

CodeSmith采用的类似ASP.net的模板,运行时将模板通过自带的编译器编译为标准的.net类,然后调用该类的Remder方法进行模板的输出。具体流程如图:

CodeSmith编译的模板生成的类以CodeSmith.Engine.CodeTemplate为基类,提供Render方法用于输出代码文件。

在编译时,CodeSmith调用CodeSmith.Engine.CodeTemplateCompiler类对模板文件进行处理,转化为标准的.net代码文件,然后再调用.Net的编译器编译为.net程序。

CodeTemplateCompiler通常根据一个.cst文件进行构造,然后调用Compiler()方法进行编译。如果编译成功(根据Error.Count==0判定),则调用GetInstance()方法得到CodeTemplate类的对象。

CodeTemplate是所有模板编译后生成的类的基类,该类提供SetProperty()方法设置模板的属性,提供Render()方法将模板内容根据模板的属性,将模板的内容输出为文本、或者输出到文件。

CodeTemplateCompiler编译模板的原理其实也不复杂,将模板头语句进行解析和转化;将不变的部分用WriteLine进行输出(例如你写了一个空行,则转化为WriteLine(););将代码块(<Script runat=Template> </Script>)直接复制;将<%%>稍作转换。当然,实际的实现不想描述的简单。

实际生成的代码可以通过CodeSmith Studio中Tools-CompileToAssembly生成为DLL。

二,         CodeTemplateGUI

.Net环境提供了一个控件:PropertyGrid,用来对类的属性进行设置,该控件最重要的属性是SelectObject,只要将需要进行设置的类指派到该属性,控件就可以利用反射发现该类的属性和设计时标签(Attribute),进行显示和配置。

CodeTemplate类经过CodeTemplateCompiler类编译得到的对象,可以直接绑定到PropertyGrid进行设置,CodeSmithStudio即是采用了这种方法。但是CodeSmithCodeSmith Explorer中采用了一个自己开发的,继承于PropertyGridEnhancedPropertyGrid进行主要的设置和输出工作。

CodeTemplate类继承于CodeSmith.Engine.Control类。并且将所有不用于客户端设置的属性加上Browsable(false)标签,不在PropertyGrid中显示。

在使用CodeSmith API的使用,利用这一点和GUI进行结合,效果非常好。(人家本来就是这么设计的嘛!)

SPLEB开发日志——CodeSmith原理剖析(2)