当前位置:K88软件开发文章中心编程工具CodeSmith → 文章内容

CodeSmith 编写第一个代码模板

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-24 10:16:27

由 珍珍阿姨 创建, 最后一次修改 2016-08-12 编写第一个代码模板在CodeSmith 使用教程(1): 概述我们通过使用 CodeSmith 从数据库自动生成 NHiberate 代码,可以了解到使用 CodeSmith 自动生成代码的基本步骤:选择使用合适的模板,CodeSmith 随开发包自带了大量常用的模板,如果找不到合适的模板,CodeSmith 支持自定义模板。为模板选择合适的参数设置。自动生成代码(可以为任意类型的代码,C#,Java, .XML 文本等)其核心为代码模板文件,随 CodeSmith 自带了不少常用的模板,可以通过模板浏览器来查询,此外网上也有很多第三方开发的模板,在使用前可以先查查是否已有现成的模板,或是可以通过修改现有的模板来完成自动生成代码的需要。在开发应用时,很多人都喜欢通过复制以前的项目中的代码,然后通过修改以满足新项目,这些重用的代码通常具有很多共性(可以想想 C++ 的模板类,C# 的 Generic 等),CodeSmith 就是用来为这些具有相似性的代码创建模板,然后通过设置属性(代码直接的不同点),就可以自动创建所需代码。本例通过一个简单的例子来介绍创建一个自定义代码模板的方法。CodeSmith 提供了 Visual Studio的集成开发环境的支持,本例也是通过创建模板自动生成简化每个的 C# 项目都需要的 AssemblyInfo.cs,在开发 C# 应用时,一般是通过手工修改 AssemblyInfo.cs 的中属性(或者是 Copy & Paste :-)).首先我们使用 Visual Studio 创建一个 C# HelloWorld 下面(Console 或是 WinForm 项目都可以),可以打开项目中的 AssemblyInfo.csusing System.Reflection;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;// General Information about an assembly is controlled through the following// set of attributes. Change these attribute values to modify the information// associated with an assembly.[assembly: AssemblyTitle("HelloWorld")][assembly: AssemblyDescription("")][assembly: AssemblyConfiguration("")][assembly: AssemblyCompany("Microsoft")][assembly: AssemblyProduct("HelloWorld")][assembly: AssemblyCopyright("Copyright ? Microsoft 2013")][assembly: AssemblyTrademark("")][assembly: AssemblyCulture("")]// Setting ComVisible to false makes the types in this assembly not visible// to COM components. If you need to access a type in this assembly from// COM, set the ComVisible attribute to true on that type.[assembly: ComVisible(false)]// The following GUID is for the ID of the typelib if this project is exposed to COM[assembly: Guid("72797715-64b9-4bab-a49f-f55e8a0a18d7")]// Version information for an assembly consists of the following four values://// Major Version// Minor Version// Build Number// Revision//// You can specify all the values or you can default the Build and Revision Numbers// by using the '*' as shown below:// [assembly: AssemblyVersion("1.0.*")][assembly: AssemblyVersion("1.0.0.0")][assembly: AssemblyFileVersion("1.0.0.0")]为了使用 CodeSmith,我们在 HelloWorld 中添加 CodeSmith 的项目文件并创建一个模板文件AssemblyInfo.cst创建好的项目文件如下:编写 CodeSmith 的代码模板和编写 Asp.Net 的 Page 非常类似,CodeSmith 支持以 C#,VB.Net和 JavaScript 做为脚本语言来编写模板,本例使用 C# 做为脚本语言(源代码/语言),计划生成的也是 C# 语言(目标代码/语言),打开 AssemblyInfo.cst,修改代码为<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Create an AssemblyInfo.cs file." %>每个 CodeSmith 的代码模板都是以 CodeTemplate 开始,定义代码模板使用的源语言,目标语言和简单的描述。然后将这个模板添加到 CodeSmith 项目中,可以右键单击 codesmith.csp ,选择 Add output这时 CodeSmith 的项目将创建好了,但单击”Generate code”不会生成任何代码,因为我们的代码模板 AssemblyInfo.cst 没做任何事。创建代码模板可以从生成的结果开始,可以直接先把要生成的代码复制到代码模板 AssemblyInfo.cst中,比如:using System.Reflection;using System.Runtime.CompilerServices;//// Created: 1/1/2013// Author: James Shen//[assembly: AssemblyTitle("User storage utility")][assembly: AssemblyDescription("Helps manage data in Isolated Storage files.")][assembly: AssemblyConfiguration("Retail")][assembly: AssemblyCompany("Guidebee Pty Ltd, Inc.")][assembly: AssemblyProduct("StorageScan")][assembly: AssemblyCopyright("Copyright (c) Guidebee Pty Ltd.")][assembly: AssemblyCulture("")][assembly: AssemblyVersion("1.0.*")][assembly: AssemblyFileVersion("1.0")][assembly: AssemblyDelaySign(true)]可以把要生成的代码模板的内容分成三部分:固定内容可以通过代码动态生成的部分(如上面的日期)需要用户提供属性配置的部分此时如果使用 Codesmith 的 Generate Codes, 将自动生成 AssemblyInfo.cs (缺省为模板名),不过 AssemblyInfo.cs 位置不是我们所需的 Properties/AssemblyInfo.cs, 这可以通过重载代码模板的 GetFileName 方法来实现:<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Create an AssemblyInfo.cs file." %>...<script runat="template">public override string GetFileName() { return "Properties/AssemblyInfo.cs";}</script>这样在使用 CodeSmith 项目的 Generate Codes,就自动覆盖原来的 Properties/AssemblyInfo.cs 文件。 内容就是模板中的代码部分。但每次生成的代码都是固定的,作为模板来说没有什么灵活性,下面我们可以通过检查模板的内容,觉定那些内容是可变的。比如 AssemblyInfo.cs 的日期和 Assembly 的各个属性对于不同的项目来说是可变的。这些可变的内容其中一部分可以通过代码自动生成(如日期),有一部分需要用户来配置,比

[1] [2]  下一页


CodeSmith 编写第一个代码模板