生成新项目:揭秘,第 1 部分
曾经想过如何创建自己的项目类型? 想知道创建新项目时实际会发生什么情况? 让我们看一下头罩下, 看看到底发生了什么。
Visual Studio 可协调多个任务:
它显示所有可用项目类型的树。
它显示每个项目类型的应用程序模板列表,并允许你选取一个。
它收集应用程序的项目信息,例如项目名称和路径。
它将此信息传递给项目工厂。
它在当前解决方案中生成项目项和文件夹。
“新建项目”对话框
当你为新项目选择项目类型时,这一切都开始。 首先,单击“文件”菜单上的“新建项目”。 此时会显示“ 新建项目 ”对话框,如下所示:
接下来将更详细地介绍。 “ 项目类型 ”树列出了可以创建的各种项目类型。 选择项目类型(如 Visual C# Windows)时,你将看到应用程序模板列表以帮助你入门。 Visual Studio 安装的模板 由 Visual Studio 安装,可供计算机的任何用户使用。 你创建或收集的新模板可以添加到 “我的模板 ”中,并且仅供你使用。
选择一个模板(如 Windows 应用程序)时,对话框中会显示应用程序类型的说明;在本例中, 用于创建具有 Windows 用户界面的应用程序的项目。
在 “新建项目 ”对话框的底部,你将看到多个控件来收集详细信息。 看到的控件取决于项目类型,但通常它们包括项目名称文本框、“位置”文本框和相关“浏览”按钮,以及解决方案检查框的解决方案名称文本框和相关“创建目录”。
填充“新建项目”对话框
“ 新建项目 ”对话框从何处获取其信息? 此处有两种机制,其中一种机制已弃用。 “ 新建项目 ”对话框合并并显示从这两种机制获取的信息。
较旧的(已弃用)方法使用系统注册表项和 .vsdir 文件。 此机制在 Visual Studio 打开时运行。 较新的方法使用 .vstemplate 文件。 此机制在初始化 Visual Studio 时运行,例如,通过运行
devenv /setup
or
devenv /installvstemplates
项目类型
项目类型根节点(如 Visual C# 和其他语言)的位置和名称由系统注册表项确定。 子节点(如数据库和智能设备)的组织镜像包含相应 .vstemplate 文件的文件夹的层次结构。 让我们先看看根节点。
项目类型根节点
初始化 Visual Studio 时,它会遍历系统注册表项的子项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs 以生成和命名项目类型树的根节点。 此信息会缓存以供以后使用。 查看 TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1 键。 每个条目都是 VSPackage GUID。 忽略子项(/1)的名称,但其状态指示这是 项目类型 根节点。 根节点反过来可能有多个子项来控制其在项目类型树中的外观。 让我们看看其中一些。
(默认值)
这是命名根节点的本地化字符串的资源 ID。 字符串资源位于 VSPackage GUID 选择的附属 DLL 中。
在此示例中,VSPackage GUID 为
{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}
根节点的资源 ID(默认值)为 #2345
如果在附近的 Packages 键中查找 GUID 并检查 SatelliteDll 子项,则可以找到包含字符串资源的程序集的路径:
<Visual Studio 安装路径>\VC#\VCSPackages\1033\csprojui.dll
若要验证这一点,请打开文件资源管理器并将 csprojui.dll 拖动到 Visual Studio 目录中。 字符串表显示资源 #2345 具有 描述文字 Visual C# 。
SortPriority
这将确定根节点在项目类型树中的位置。
SortPriority REG_DWORD 0x00000014 (20)
优先级数越低,树中的位置就越高。
DeveloperActivity
如果存在此子项,则根节点的位置由“开发人员设置”对话框控制。 例如,
DeveloperActivity REG_SZ VC#
指示如果 Visual Studio 设置为 Visual C++ 开发,则 Visual C# 将是根节点。 否则,它将是其他语言的子节点。
文件夹
如果存在此子项,则根节点将成为指定文件夹的子节点。 可能的文件夹列表显示在密钥下
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders
例如,“数据库项目”条目具有与伪文件夹中的“其他项目类型”条目匹配的文件夹键。 因此,在“项目类型”树中,“数据库项目”将是其他项目类型的子节点。
项目类型子节点和 .vstdir 文件
项目类型树中子节点的位置遵循 ProjectTemplates 文件夹中文件夹的层次结构。 对于计算机模板(已安装 Visual Studio 的模板),典型位置为 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\,对于用户模板(My templates),典型位置为 \My Documents\Visual Studio 14.0\Templates\ProjectTemplates\。 合并这两个位置中的文件夹层次结构以创建 项目类型 树。
对于具有 C# 开发人员设置的 Visual Studio,项目类型 树如下所示:
相应的 ProjectTemplates 文件夹如下所示:
当“新建项目”对话框打开时,Visual Studio 将遍历 ProjectTemplates 文件夹,并在 Project 类型树中重新创建其结构,并进行了一些更改:
项目类型树中的根节点由应用程序模板确定。
节点名称可以本地化,并且可以包含特殊字符。
可以更改排序顺序。
查找项目类型的根节点
当 Visual Studio 遍历 ProjectTemplates 文件夹时,它将打开所有 .zip 文件并提取任何 .vstemplate 文件。 .vstemplate 文件使用 XML 来描述应用程序模板。 有关详细信息,请参阅 “新建项目生成:在引擎盖下,第二部分”。
<ProjectType> 标记确定应用程序的项目类型。 例如,\CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip 文件包含具有此标记的 EmptyProject.vstemplate 文件:
<ProjectType>CSharp</ProjectType>
<ProjectType> 标记(而不是 ProjectTemplates 文件夹中的子文件夹)确定项目类型树中的应用程序的根节点。 在此示例中,Windows CE 应用程序将显示在 Visual C# 根节点下,即使要将 WindowsCE 文件夹移动到 VisualBasic 文件夹,Windows CE 应用程序仍将显示在 Visual C# 根节点下。
本地化节点名称
当 Visual Studio 遍历 ProjectTemplates 文件夹时,它会检查找到的任何 .vstdir 文件。 .vstdir 文件是一个 XML 文件,用于控制“新建项目”对话框中项目类型的外观。 在 .vstdir 文件中,使用 <LocalizedName> 标记命名 项目类型 节点。
例如,\CSharp\Database\TemplateIndex.vstdir 文件包含以下标记:
<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>
这将确定命名根节点的本地化字符串的附属 DLL 和资源 ID,在本例中为 数据库命名。 本地化名称可以包含不适用于文件夹名称的特殊字符,例如 .NET。
<如果没有 LocalizedName> 标记,则项目类型由文件夹本身 Smart电话2003 命名。
查找项目类型的排序顺序
若要确定项目类型的排序顺序,.vstdir 文件使用 <SortOrder> 标记。
例如,\CSharp\Windows\Windows.vstdir 文件包含以下标记:
<SortOrder>5</SortOrder>
\CSharp\Database\TemplateIndex.vstdir 文件具有具有较大值的标记:
<SortOrder>5000</SortOrder>
SortOrder> 标记中的<数字越小,树中的位置越高,因此 Windows 节点显示高于项目类型树中的数据库节点。
<如果未为项目类型指定 SortOrder> 标记,则它按字母顺序显示在包含 <SortOrder> 规范的任何项目类型之后。
请注意,“我的文档”(我的模板)文件夹中没有 .vstdir 文件。 用户应用程序项目类型名称未本地化,并按字母顺序显示。
快速评审
让我们修改“ 新建项目 ”对话框并创建新的用户项目模板。
将 MyProjectNode 子文件夹添加到 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp 文件夹。
使用任何文本编辑器在 MyProjectNode 文件夹中创建 MyProject.vstdir 文件。
将这些行添加到 .vstdir 文件:
<TemplateDir Version="1.0.0"> <SortOrder>6</SortOrder> </TemplateDir>
保存并关闭 .vstdir 文件。
使用任何文本编辑器在 MyProjectNode 文件夹中创建 MyProject.vstemplate 文件。
将这些行添加到 .vstemplate 文件:
<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <ProjectType>CSharp</ProjectType> </TemplateData> </VSTemplate>
保存 .vstemplate 文件并关闭编辑器。
将 .vstemplate 文件发送到新的压缩 MyProjectNode\MyProject.zip 文件夹。
在 Visual Studio 命令窗口中,键入:
devenv /installvstemplates
打开 Visual Studio。
打开“ 新建项目 ”对话框并展开 Visual C# 项目节点。
MyProjectNode 在 Windows 节点下显示为 Visual C# 的子节点。