将自定义 Visual Studio 代码生成模板添加到“添加新项”对话框






4.53/5 (28投票s)
2003年12月17日
6分钟阅读

153880
一篇关于将自定义 Visual Studio 代码生成模板添加到“添加新项”对话框的文章
引言
本文将解释如何将新创建或修改的 VS 代码模板添加到 Visual Studio IDE 中的“添加新项”对话框。背景
在阅读了“sh856531”撰写的关于“自定义 Visual Studio 的代码生成模板”的文章后,我想创建一个接口模板供我自己开发使用。问题
“如何让新模板在启动‘添加新项’对话框时显示?”解决方案
我们需要修改 LocalProjectItems 文件夹及其子文件夹中的 VSDir 文件。VSDir 文件是一个扩展名为 .vsdir 的文本文件,它向“添加项”和“新建项目”对话框提供有关如何显示其项的信息,例如它们的名称、显示顺序以及与之关联的图标。您可以在单个目录中拥有多个 VSDir 文件,但通常,单个 VSDir 文件包含多个向导、文件夹和模板的记录。文件中的每条记录都用换行符分隔,并用竖线(|)字符分隔每条记录中的字段。任何没有有意义数据的可选字段都应包含零(0)作为占位符。
以下是 VSDir 文件的示例 [已换行]
..\..\CSharpAddClassWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
#2245|10|#2262|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|Class.cs
..\..\CSharpAddInterfaceWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
Interface|20|An empty interface declaration|
{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|Interface.cs
..\..\CSharpAddComponentWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
#2246|20|#2265|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4517|0|Component.cs
..\..\NewCSharpFile.cs|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
#2261|30|#2267|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4516|0|CodeFile.cs
..\..\CSharpAddWinServiceWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
#2291|40|#2292|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4520|0|Service.cs
..\..\NewInstaller.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
#2269|50|#2270|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4518|0|Installer.cs
首先,让我们创建新模板。
所采取的步骤如下
- 找到 Visual Studio .NET 安装中的 VC#Wizards 目录。默认安装位置为 C:\Program Files\Microsoft Visual Studio .NET\VC#\VC#Wizards。
- 在此目录中创建一个新文件夹,并将其命名为 CSharpAddInterfaceWiz。此名称是根据现有向导遵循的约定得出的。
- 将 CSharpAddClassWiz 的内容复制到此新文件夹中。这将为您提供一个 Templates\1033 子目录(以及 Scripts\1033 子目录),其中包含两个文件 - Templates.inf 和 NewCSharpFile.cs。
- 根据您的需求修改 NewCSharpFile.cs。一种方法是使用 Visual Studio .NET 构建所需的 Interface.cs 代码文件,然后将其放入此文件夹中。粗体显示的项将在使用向导将代码文件插入项目时被替换。!output 指令用于向导引擎输出符号值。例如,SAFE_NAMESPACE_NAME 是项目默认名称空间的名称。
- Visual Studio .NET 使用扩展名为 .vsdir 的文件来识别并加载这些代码模板到“添加新项”对话框中。我们将使用任何文本编辑器修改“C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\CSharpProjectItems\LocalProjectItems\Code”和“C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\CSharpProjectItems\LocalProjectItems”文件夹中的 .vsdir 文件。
- 打开“C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\CSharpProjectItems\LocalProjectItems\Code\code.vsdir”文件,您将在文件中看到以下代码行
- 复制该行,粘贴到下方新的一行,并修改粗体部分
- 我们将此行添加到 Code 文件夹内的 .vsdir 文件中,因为我们希望此模板在 Code 部分可用。
- 打开“C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\CSharpProjectItems\LocalProjectItems\ LocalProjectItems.vsdir”文件,您将在文件中看到以下代码行
- 复制该行,粘贴到下方新的一行,并修改以下内容
- 打开以下文件夹 C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\CSharpProjectItems 并创建一个名为 CSharpAddInterfaceWiz.vsz 的文件。现在找到 CSharpAddClassWiz.vsz 文件,打开它并将数据复制到您新创建的文件中。我们现在将修改我们新文件 CSharpAddInterfaceWiz.vsz 中的数据以反映以下内容
- Wizard=VsWizard.VsWizardEngine.7.1 这行告诉 Visual Studio 是 2002 年还是 2003 年版本。
- 现在,我们应该准备好启动 Visual Studio 并使用我们的新接口模板了。 以下是 VSDir 文件中字段的说明
namespace [!output SAFE_NAMESPACE_NAME]
{
/// <summary>
/// Summary description for [!output SAFE_CLASS_NAME] Interface.
/// </summary>
public class [!output SAFE_CLASS_NAME]
{
#region [!output SAFE_CLASS_NAME] Properties
#endregion
#region [!output SAFE_CLASS_NAME] Methods
#endregion
}
}
..\..\CSharpAddClassWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
#2245|10|#2262|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|Class.cs
..\..\CSharpAddInterfaceWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
Interface|10|An empty interface declaration|
{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|Interface.cs
..\CSharpAddClassWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
#2245|20|#2262|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|Class.cs
..\CSharpAddInterfaceWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|
Interface|20|An empty interface declaration|
{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|Interface.cs
VSWIZARD 7.0
Wizard=VsWizard.VsWizardEngine.7.1
Param="WIZARD_NAME = CSharpAddInterfaceWiz"
Param="WIZARD_UI = FALSE"
Param="PROJECT_TYPE = CSPROJ"
- 任何非必需字段,如果其没有有意义的数据,都应包含 0(零)作为占位符。
- 如果没有提供本地化名称,则使用相对路径名
- 如果没有定义图标,IDE 会为具有该扩展名的文件的默认图标进行替换。
- 如果没有提供建议的基础名称,则使用“Project”。
字段 | 含义 |
RelPathName |
必需。向导的 .vsz 文件名,例如 MyWizard.vsz。 |
{clsidPackage} |
可选。表示具有包含本地化资源的 DLL 的产品的 GUID(例如 Visual C++)。通常,对于与第三方向导对应的 VSDir 文件,此字段为空。 |
LocalizedName |
可选。这是向导或模板的本地化名称,也是“添加项”对话框中显示的名称。它可以是字符串或形式为 #ResID 的资源标识符。 |
SortPriority |
必需。一个整数,表示向导的排序顺序和相对优先级,1 为最高。例如,如果此项为“1”,那么它将与其他的 1 一起显示,并且排在所有 2 或更低的值之前。 |
描述 |
必需。模板或向导在“添加项”对话框中选定项时显示的本地化描述。它可以是字符串或形式为 #ResID 的资源标识符。仅适用于模板文件,不适用于文件夹。 |
DLLPath 或 {clsidPackage} |
必需。指定 DLL 或 EXE 文件的完整路径,或者一个具有包含向导图标的 .dll 文件的产品的 GUID。使用给定的 IconResourceId 从 DLL/EXE 文件中加载图标作为资源。如果指定了 {clsidPackage} ,此设置将覆盖其在图标位置的设置。仅适用于模板文件,不适用于文件夹。 |
IconResourceId |
可选。DLL 文件中的一个资源标识符,用于确定要显示的图标。如果没有定义图标,环境会为扩展名与该项相同的文件的默认图标进行替换。仅适用于模板文件,不适用于文件夹。 |
标志 |
必需。请参见下面的 Flags 描述和表格。仅适用于模板文件,不适用于文件夹。 |
SuggestedBaseName |
必需。向导的默认名称,在对话框的“名称”字段中显示。它可以是字符串或形式为 #ResID 的资源标识符。如果名称不唯一,环境会在名称后附加一个整数。例如,MyFile.asp 可能会更改为 MyFile1.asp。如果未提供名称,则使用“Project”。仅适用于模板文件,不适用于文件夹。 |
注释
好了,现在您就可以在“添加新项”对话框中使用新的代码模板了。请注意,此项也根项目文件夹中可用。
这是在代码编辑器中生成后的代码外观
历史
- 版本 1.0
- 版本 1.1 - 添加了原始草稿中遗漏的步骤。
结论
这是我的第一篇文章,我希望每个人都能从中受益。来自澳大利亚的问候...