T4+VSIX打造VS2010代码生成自定义工具

259 篇文章 4 订阅
148 篇文章 1 订阅

VS2010 在 C++ 项目中使用 T4 Template 的方法

http://www.cppblog.com/diryboy/archive/2010/08/17/vs2010addt4incppproject.html

T4 简介

T4,全称 Text Template Transformation Toolkit,早在 VS2005 中就存在的东西,只是没有高度集成,VS2010 在托管项目中新增了添加 Text Template 文件的模板,但是并没有代码颜色和智能感知,可以说它是 Visual Studio 一个“隐藏”的特性。T4 一般用来从某种“模型”自动生成好用的代码,例如从XML模型生成操作它的强类型代码。不知道是不是 C++ 的宏和模板实在太强大,貌似这种代码生成器用在托管语言中用得广泛多,其实我想在 C++ 中用这个也是跟托管程序有关。

一般来说,在托管的项目中添加一个 .tt 后缀名的文本文件即可用到 T4,如图:

.tt Magic

对于生成什么扩展名的文件,其实并没有限制,可以在 .tt 文件的处理指令中指定:

<#@ template language="C#" #>
<#@ output extension=".generated.cs" #>

然后就基本好像写 PHP 或者 ASP 那样了,不同之处在于 T4 的生成步骤是在一个方法中的,如果要自定一些帮助函数,需要用 <#+ 和 #> 包围。参见 MSDN 上一个简单的例子:Walkthrough: Generating Code by using Text Templates

 

尝试在 C++ 项目中添加

第一步,肯定要先添加一个 .tt 文件。很不幸地发现,魔法没有自动出现,.tt 文件是在那里了,但是没有自动生成的文件,IDE 也没有显示什么文件跟这个 .tt 有关联关系。很显然,需要告诉 IDE 更多事情。

其实在尝试这个东西之前,我是有想过最终的成功率的,根据我的了解,1) Visual Studio 使用 MSBuild 的项目文件,2) VS2010 构建 C++ 项目使用 MSBuild,3)T4 可以作为 MSBuild 中的一个 Custom Build Tool 介入。从这三点理解的话,可知只要修改项目文件,即使 VS 不支持某些东西,只要它不乱改我们在项目文件中的设置,就可以保证构建的项目是正确的。

有了上面的知识,可以开始下一步的尝试了:新建一个 C# 项目,添加一个 .tt 文件,然后观察项目文件如何变化,其实稍微了解 MSBuild 项目文件的结构是怎么样的话,很快就知道了。我的项目需要的是根据“旧的”文件自动生成上万个包装函数,而这个“旧的”意思是,这个文件会在其他社区不断地更新,增加更多函数,我做了这个自动生成的就无需每次都根据新文件手动查找替换修改了。于是我修改成这个样子:

 
 
[折叠代码]
<!-- Items that use T4 --> < ItemGroup > < None Include =" Scripting.tt" > < Generator >TextTemplatingFileGenerator </ Generator > < FileType >Asax </ FileType > </ None > < ClInclude Include =" Scripting.h" > < AutoGen >True </ AutoGen > < DependentUpon >Scripting.tt </ DependentUpon > < DesignTime >True </ DesignTime > </ ClInclude > < None Include =" Scripting_.h" /> </ ItemGroup >
[折叠代码]

其实,这段东西的重点在于,.tt 有一个 Generator 子标签,内容是 TextTemplatingFileGenerator,标签 None 它表示不参与到 Build 中,只是 T4 用的。ClInclude 表示我生成的 .h 文件在 Build 过程中是头文件,AutoGen 表示这个文件由工具自动生成,DependentUpon 可以使 Visual Studio 知道这两个家伙有联系。

现在重新载入项目,可以看到 Visual Studio 将他们关联了,但是赶出了 Header Files,而我就将它们放到一个新的 Filter 中去:

Magic again

 

快搞定了!

但是我们拿这个编辑过的项目文件构建的时候,并没有看到有输出文件。也就是说,T4 其实还没有介入。而在托管的项目中,当你保存 .tt 文件的时候,或者点击 Solution Explorer 上运行 Transform 的时候,T4 引擎就会自动运行生成输出,如果你改变 output 指令的 extension 参数,输出文件的扩展名还会自动更改,确切地说,旧的文件会被移到回收站。正当我快要放弃的时候,突然发现 MSDN 文档中有一节:Code Generation in a Build Process,其中表示,只要装上 Visual Studio Visualization and Modeling SDK 然后在项目文件差不多最后的地方加上以下代码即可:

<!-- Enable TransformOnBuild for Msbuild -->
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />
<PropertyGroup>
  <TransformOnBuild>True</TransformOnBuild>
</PropertyGroup>

噢,终于胜利了!最后发现,仍然不能直接只在 .tt 文件中修改输出指令的 extension 参数,VS 不会帮你自动更改,需要自己动手修改项目文件,不过这个就无所谓了,因为我的目的达到了,思想也验证了。

最后附上示例项目文件

T4+VSIX打造VS2010代码生成自定义工具

http://winsystem.ctocio.com.cn/179/11849679.shtml

使用过ADO.NET Entity框架的人应该都有接触过实体生成模板,也就是标题中所说的T4(Code Generation and Text Templates:由一些文本模板和控制逻辑组成的混合体……

  使用过ADO.NET Entity框架的人应该都有接触过实体生成模板,也就是标题中所说的T4(Code Generation and Text Templates:由一些文本模板和控制逻辑组成的混合体,可以使用这些模板生成应用程序的部分源代码),但如果通过其他的模板去生成实体,每次都需要将模板添加到项目中,然后修改模板中.edmx文件的路径才能生成相应的实体。那么能不能做到像提供的默认生成模板一样,直接运行自定义工具就生成相应的实体呢?

  答案当然是“可以的”。那么接下首先介绍如何开发代码生成自定工具。

  在进行开发之前首先需要下载Visual Studio 2010 SDK,因为需要使用VSPackage和Managed Extensibility Framework (MEF) 扩展来扩展 Visual Studio 2010。

  安装完成之后,【新建项目】,在项目模板“Extensibility”分类里面可以看到“VSIX Project”,如下图所示:

image

  创建项目“Kevin.Develop.CodeGenerateCustomTool”,然后添加所需程序集的引用,如下图所示:

image

  添加代码生成类MyCodeGenerator的定义,给类添加特性(Attribute)System.Runtime.InteropServices.Guid(),然后点击【工具】【创建GUID】,生成的Guid(注册表格式并删除左右大括号)作为特性的参数,代码如下所示:

以下是代码片段:
    [System.Runtime.InteropServices.Guid("391B243E-DB88-42F8-8F64-A355042D7507")]
  public class MyCodeGenerator : TemplatedCodeGenerator
  {
  protected override byte[] GenerateCode(string inputFileName, string inputFileContent)
  {
  return base.GenerateCode(inputFileName, inputFileContent);
  }
  }

  注册MyCodeGenerator代码生成类,代码如下所示:

以下是代码片段:
    [ProvideCodeGenerator(typeof(MyCodeGenerator),
  "MyCodeGenerator",
  "Generates C# Code", true,
  ProjectSystem = ProvideCodeGeneratorAttribute.CSharpProjectGuid,
  RegisterCodeBase = true)]
  internal sealed partial class MyCodeGeneratorPackage
  {
  }

在项目中添加文件“CodeGenerator.pkgdef”,并更改以下属性:

  Include in VSIX设置为“True”

  复制到输出目录设置为“如果较新则复制”

  生成操作设置为“内容”

  文件中添加内容如下所示,注意修改CLSID guid为前面生成的GUID:

以下是代码片段:
    [$RootKey$\Generators]
  [$RootKey$\Generators\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}]
  [$RootKey$\Generators\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\MyCodeGenerator]
  @="Generates C# Code"
  "CLSID"="{391B243E-DB88-42F8-8F64-A355042D7507}"
  "GeneratesDesignTimeSource"=dword:00000001
  [$RootKey$\CLSID]
  [$RootKey$\CLSID\{391B243E-DB88-42F8-8F64-A355042D7507}]
  @="Generates C# Code"
  "Class"="Kevin.Develop.CodeGenerateCustomTool.MyCodeGenerator"
  "InprocServer32"="$WinDir$\system32\mscoree.dll"
  "ThreadingModel"="Both"
  "CodeBase"="$PackageFolder$\Kevin.Develop.CodeGenerateCustomTool.dll"

  简单解释下上面的内容:

  在C# Project 项目中定义了一个命名为“MyCodeGenerator”的用户自定义工具

  自定义工具有唯一的GUID 391B243E-DB88-42F8-8F64-A355042D7507以及说明文本“Generates C# ”

  自定义工具关联Kevin.Develop.CodeGenerateCustomTool.MyCodeGenerator代码生成类

  接下来将自定义工具添加至VISX中进行部署,在创建项目时会自动生成“source.extension.vsixmanifest”文件,双击该文件,修改ID等属性,需要注意的是需要修改Supported VS Editions,选择支持的VS版本,然后在最下面的栏目“Content”中添加内容,将本项目作为VS Package类型的内容添加进VSIX,如下图所示:

image

  最后还需要修改下项目属性,保存当前项目,然后通过文本的方式打开项目文件“Kevin.Develop.CodeGenerateCustomTool.csproj”,将下图中的属性全部修改为true:

image

  保存编辑结果,然后打开项目,并编译生成,在生成结果文件夹中可以找到“Kevin.Develop.CodeGenerateCustomTool.vsix”文件,运行该文件。

  重新启动Visual Studio ,在【工具】【扩展管理器】中可以找到我们刚刚安装的Kevin.Develop.CodeGenerateCustomTool扩展,然后打开或者创建一个测试的C#项目,添加一个“文本模板”类型的.tt文件,文件默认的自定义工具为“TextTemplatingFileGenerator”,修改自定义工具属性为前面开发的自定义工具名称“MyCodeGenerator”,然后在文本模板中写一些内容(符合T4模板的语法),然后保存文件,会生成相应的文本文件。

  到此为止我们已经实现了与“TextTemplatingFileGenerator”自定义工具一样功能的文本模板的代码生成器,那么下面会接着介绍如何将ADO.NET Entity的文本模板加入到我们的自定义工具中。


Tangible T4 Editor for Visual Studio 2010 RTM

http://www.coderblog.in/2010/05/tangible-t4-editor-for-visual-studio-2010-rtm.html

tangible T4 Editor for Visual Studio 2010 RTM 版出来了,这个是专门FORVS2010的,可以在VS2010里使用T4智能提示和语法高亮等,需要的朋友快去下载吧:)

PreviewT4Editor

T4Editor For Vs2010

安装方法有2种:
1.直接在线安装:
在 VS 2010 里选择 Tools Menu->Extension Manager. 然后点击 “Online Gallery” 选择 T4 Editor 下载,然后重起VS 2010.

2.下载安装:
你可以点击这里下载,然后双击运行即会自动进行安装了。


VS2010 扩展 ProPowerTools

http://www.coderblog.in/2011/04/vs2010-extensions-propowertools.html

这次为大家介绍一个VS2010非常有用的扩展,此扩展功能就如其名ProPowerTools

现在我为大家介绍感觉其中几个比较好用的功能。首先看看此扩展的后台功能,这里或以控制多项功能是否启用:

功能设置

1、标签固顶
其实我一直在使用此扩展,最让我喜欢的一个功能就是其标签固顶并且可分行显示,当同时打开多个文件进行编辑时,这个功能非常有用。一般情况下,如果打开的文件太多,因为一行显示不完,有部分标签就会被隐藏了,要使用滚动条拉过去才可以看到,而经常需要对应几个文件进行修改,这样找起文件来也很不方便,有了标签固顶功能就方便多了,可以将现常用的几个文件标签固顶,然后设置为分行显示,这样或大大节省了空间,也不会为了要多个文件间切换弄得找不到文件了,效果如下:

标签固顶

要使用分行显示功能,还需在扩展设置里打开以下选项(红色框的)

启用分行标签

除了可分行显示外,还有一个好处就是可以一次性关闭所有非固顶标签哦。

2、直接查看类信息
当鼠标放到类名称上,就会显示此类的成员信息,还可以进行搜索:

鼠标悬停

查看类成员信息

3、解决方案浏览器的增强
ProPowerTools会为VS增加一个加强版的解决方案浏览器,其可以直接输入文件名进行搜索,其中一个比较好用的功能是可以只查看某个项目或者目录下的文件,就如同进入了一级子目录一样,将其他的项目都隐藏起来了,这样可以方便集中修改某项目下文件时使用,特别是项目比较多的时候这个功能还是挺不错的:biggrin:

悬停时点击右边图标

进去后就只看到此项目的文件了

4、滚动条预览
此功能是最新版里才有的,感觉也挺不错的。就是把鼠标放在滚动条上,即可预览到当前滚动条位置的代码:

滚动条代码预览

以上只是我比较常用的一些功能,此扩展还有很多有趣的功能等着大家自己去发现哦(或者点击以下链接到官方网站查看详细介绍),如按Ctrl直接进行代码跳转等,使用VS2010的朋友不防一试。:wink:

不过最后要说说的是,如果你已经在使用旧版并想要升级的话,记得先要卸载旧版才可安装新版的,否则总会报出扩展签名不对然后不让安装的信息。

File  下载ProPowerTools 
http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef?SRC=VSIDE


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值