天天看点

[SPLEB]CodeSmith原理剖析(1)

一,         CodeSmtih的代码生成原理

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

[SPLEB]CodeSmith原理剖析(1)

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。

二,         CodeTemplate与GUI

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

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

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

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

<a href="http://yuandong.cnblogs.com/archive/2006/02/04/325272.html">SPLEB开发日志——CodeSmith原理剖析(2)</a>

本文转自冬冬博客园博客,原文链接:http://www.cnblogs.com/yuandong/archive/2006/02/04/325259.html,如需转载请自行联系原作者

继续阅读