zoukankan      html  css  js  c++  java
  • T4+VSIX 打造Visual Studio 2010 中的Entity代码生成自定义工具

    T4+VSIX 打造Visual Studio 2010 中的Entity代码生成自定义工具(上)

    首先简单介绍下T4(Code Generation and Text Templates),也就是有一些文本模板和控制逻辑组成的混合体,可以使用这些模板生成程序中的部分源代码。

    在Visual Studio中这些模板只是简单的文本而已,那么是如何解析这些文本生成代码文件的呢?生成的关键就在于文件的“自定义工具”属性,在Visual Studio中“文本模板”的后缀为.tt,添加“文本模板”文件,查看文件的属性,会发现“自定义工具”属性值为“TextTemplatingFileGenerator”,如下图所示:

     

    尝试修改其他文本文件的“自定义工具”属性为“TextTemplatingFileGenerator”,你会发现同样可以通过该文件的文本生成代码文件。

    那么接下来主要讲解如果开发和前面提到的“TextTemplatingFileGenerator”功能一样可以通过文本模板生成代码的自定义工具,为后面的Entity的实体代码生成自定义工具做好基本的准备。

    在进行开发之前首先需要下载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”文件,运行安装该VS扩展。安装成功后,重新启动Visual Studio ,在【工具】【扩展管理器】中可以找到我们刚刚安装的Kevin.Develop.CodeGenerateCustomTool扩展。

    接下来我们测试下我们开发的自定义工具能否正常使用,修改项目中的文本文件的“自定义工具”属性为“MyCodeGenerator”,然后运行自定义工具(或者保存文件也会触发自定义工具的运行),会发现同样会根据该文件的文本生成代码,也代表着自己开发的自定义工具能正常使用。

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

    源代码下载 

    if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = true; var cb_blogId = 59710; var cb_entryId = 1976528; var cb_blogApp = "sugarcane"; var cb_blogUserGuid = "2260292a-f086-de11-be36-001cf0cd104b"; var cb_entryCreatedDate = '2011/3/7 23:18:00'; // ]]>
  • 相关阅读:
    http基础知识总结
    unittest单元测试流程
    python测试框架nose
    HTML,CSS,JS之间的关系
    无法远程连接mysql,连接后也没有权限创建数据库
    Android 导入导出CSV,xls文件 .
    Android Sqlite 导入CSV文件 .
    用java开发的网站或者程序
    111个知名Java项目集锦,包括url和描述
    Ruby简介,附带示例程序
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1988552.html
Copyright © 2011-2022 走看看