[SPLEB]CodeSmith原理剖析(1)

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

 

一,         CodeSmtih的代码生成原理

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

CodeSmith%E7%BC%96%E8%AF%91%E6%B5%81%E7%

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进行结合,效果非常好。(人家本来就是这么设计的嘛!)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值