自定义Visual Studio的代码生成模板
一个简单的教程,展示了我们如何自定义 VS 在为我们生成源代码时使用的模板。
引言
在这个简短而有趣的小片段中,我将快速介绍如何自定义 Visual Studio 在您创建新项以添加到项目时为您生成的代码。也许很多人已经知道如何做到这一点,或者可能很多人不关心,但我在代码美学方面是一个自称的挑剔者,所以我将发布这个,以防有人偶然发现并觉得它有用! :-)
背景
我非常喜欢 Visual Studio(作为一个代码制作环境,而不是作为一个网页构建器!)。它内置了许多很棒的工具和技巧,可以帮助您更快地编写出更好的代码。
它所做的事情之一是,当您创建新项时,例如新的 Web 窗体、新的用户控件等等,它会为您提供代码骨架。
现在,如果您像我一样,您可能喜欢以特定的方式格式化和组织您的代码。例如,我个人喜欢花括号出现在方法声明/if
语句等同行的位置。此外,我不喜欢在创建 Winform 时,最初生成的代码在我不希望出现注释的地方有注释。也许比您的特定风格偏好更重要的是,您的公司可能更喜欢在启动新的源文件时使用特定的代码模板和风格约定。
在使用我稍后将要讨论的技术之前,我在添加新项后要做的第一件事就是删除并重新排列 VS 刚刚生成的许多代码。这本身并不是一个大问题,但一段时间后确实会变得有点乏味。
解决方案
这个小问题的实际解决方案其实非常简单。正如您可能猜到的,Visual Studio 使用模板来创建生成的代码。鉴于模板文件是用纯文本编写的,我们所需要做的就是修改这些文件,直到我们对模板将生成的内容感到满意为止。
在我将要讨论的特定示例中,我们将使用 C# 作为我们的首选工具,并且我们将更改在添加新的 Winform 时生成的默认代码,使其更具吸引力(对我而言!)。
必要的模板文件根据它们所对应的语言以及模板要执行的功能进行存储。例如,用于创建新 WinForm 的模板存储在
C:\<安装根目录>\Microsoft Visual Studio .NET\VC#\VC#Wizards\CSharpAddWinFormWiz\Templates\1033\
文件夹 C:\<安装根目录>\Microsoft Visual Studio .NET\VC#\VC#Wizards 包含许多与 Visual Studio 知道的所有 C# 向导相对应的文件夹。每个向导文件夹中都有许多零碎的东西,但我们今天感兴趣的东西位于 Templates 文件夹中。
我们要更改的实际模板文件是:NewWinForm.cs。
注意:在您开始捣鼓和更改这些文件之前,请务必在安全的地方进行备份,以防您搞砸了什么!我倾向于将我正在更改的文件的扩展名改为 .old。另请注意,您对自己的安装所做的任何更改都完全由您自己承担风险。如果您不确定自己在做什么,那么请不要触碰任何东西,躲在毯子下面直到感觉好些。话虽如此,这绝不是什么高深莫测的事情,所以只需采取常规预防措施,一切都会好起来的.
现在您已经备份了模板文件,请在您喜欢的文本编辑器中打开该文件,您会看到
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace [!output SAFE_NAMESPACE_NAME]
{
/// <SUMMARY>
/// Summary description for [!output SAFE_CLASS_NAME].
/// </SUMMARY>
public class [!output SAFE_CLASS_NAME] : System.Windows.Forms.Form
{
/// <SUMMARY>
/// Required designer variable.
/// </SUMMARY>
private System.ComponentModel.Container components = null;
public [!output SAFE_CLASS_NAME]()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <SUMMARY>
/// Clean up any resources being used.
/// </SUMMARY>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <SUMMARY>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </SUMMARY>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "[!output SAFE_CLASS_NAME]";
}
#endregion
}
}
您会注意到的一点是,模板文件的内容与 Visual Studio 中出现的最终结果非常相似。事实上,鉴于文件类型仍然列为 .cs,您可以在 Visual Studio 中打开它,并且仍然像往常一样获得所有漂亮的语法高亮显示。
如果您曾经在字处理器中做过邮件合并,那么您会立即明白发生了什么。上面列出的代码与 VS 为您制作的代码完全相同,只不过代码中策略性地放置了各种标记。诸如 [!output SAFE_CLASS_NAME]
之类的标记由 VS 在运行时使用,以便在生成代码中动态插入信息。
鉴于 Visual Studio 使用的模板如此简单,我们可以非常容易地按照我们希望的任何方式更改模板。正如我之前提到的,我不喜欢默认插入的注释,我更喜欢将左花括号放在方法或条件语句(例如 if
、while
、for
)的同一行。此外,在创建新的 WinForm 时,我喜欢将自动生成的代码放在一个区域中,以便不碍我的事。您或您的公司可能有一个约定,某些信息总是放在源文件的顶部——例如修订详细信息。让我们快速看看那会是什么样子
/*
File Created by: mushentgrumbble
Date: 04/02/1866
Copyright Notice:
Class Description:
Notes:
Revision Log - Please mark significant changes in source code in the following format:
Date - Time - Reviewer - Comments
11/11/03 - 2.34pm - Rebecca White - Bug #457 Fixed - Code released to testing
*/
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace [!output SAFE_NAMESPACE_NAME]{
///
///
///
public class [!output SAFE_CLASS_NAME] : System.Windows.Forms.Form{
private System.ComponentModel.Container components = null;
#region Private Variables
#endregion
#region Properties
#endregion
public [!output SAFE_CLASS_NAME](){
InitializeComponent();
}
#region Auto-generated code
private void InitializeComponent(){
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "[!output SAFE_CLASS_NAME]";
}
protected override void Dispose( bool disposing ){
if( disposing ){
if(components != null){
components.Dispose();
}
}
base.Dispose( disposing );
}
#endregion
#region Event Handlers
#endregion
}
}
正如希望相当清楚的那样,我的代码版本在功能上是相同的,尽管我根据自己的偏好删除、移动和添加了各种代码片段。
下图是代码在 Visual Studio 中的样子。差异很微妙,但如果您像我一样,微妙之处有时足以让您采取行动!
结论
所以,你明白了——一种非常简单的方法来更改 Visual Studio 自动生成的代码。据我所知,你应该能够对其他已安装的语言执行此操作——只需四处看看,看看你发现了什么。我最初并不知道可以这样做。有一天,我受够了 VS 格式化代码的方式,所以我认为一定有某种模板系统在起作用。我四处查看了 Visual C# 目录,在那里我找到了 VC#Wizards 文件夹。我很想知道是否有人有任何关于 Visual Studio 中发生了什么的其他类似提示。
这是我第一次在 CodeProject 上发表文章,我有点担心人们会怎么看它。CodeProject 很棒,有这么多有才华的人分享他们的知识,所以我希望我的文章不要太糟糕!但是,如果它确实很糟糕,请随时留下您的评论,我将尽力回复提出的任何问题。我总是乐于接受关于如何改进文章的新想法,所以如果有人对如何使它们更好有任何建议,请与我联系!
历史
初稿——Code Project 第一个教程!请大家手下留情! :-)