生成新项目:揭秘,第 1 部分

曾经想过如何创建自己的项目类型? 想知道创建新项目时实际会发生什么情况? 让我们看一下头罩下, 看看到底发生了什么。

Visual Studio 可协调多个任务:

  • 它显示所有可用项目类型的树。

  • 它显示每个项目类型的应用程序模板列表,并允许你选取一个。

  • 它收集应用程序的项目信息,例如项目名称和路径。

  • 它将此信息传递给项目工厂。

  • 它在当前解决方案中生成项目项和文件夹。

“新建项目”对话框

当你为新项目选择项目类型时,这一切都开始。 首先,单击“文件”菜单上的新建项目”。 此时会显示“ 新建项目 ”对话框,如下所示:

Screenshot of the New Project dialog box.

接下来将更详细地介绍。 “ 项目类型 ”树列出了可以创建的各种项目类型。 选择项目类型(如 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,项目类型 树如下所示:

Screenshot of the Project types folder tree in Visual Studio with C# developer settings.

相应的 ProjectTemplates 文件夹如下所示:

Screenshot of the Project Templates folder tree in Visual Studio with C# developer settings.

当“新建项目”对话框打开时,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 文件。 用户应用程序项目类型名称未本地化,并按字母顺序显示。

快速评审

让我们修改“ 新建项目 ”对话框并创建新的用户项目模板。

  1. 将 MyProjectNode 子文件夹添加到 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp 文件夹。

  2. 使用任何文本编辑器在 MyProjectNode 文件夹中创建 MyProject.vstdir 文件。

  3. 将这些行添加到 .vstdir 文件:

    <TemplateDir Version="1.0.0">
        <SortOrder>6</SortOrder>
    </TemplateDir>
    
  4. 保存并关闭 .vstdir 文件。

  5. 使用任何文本编辑器在 MyProjectNode 文件夹中创建 MyProject.vstemplate 文件。

  6. 将这些行添加到 .vstemplate 文件:

    <VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
        <TemplateData>
            <ProjectType>CSharp</ProjectType>
        </TemplateData>
    </VSTemplate>
    
  7. 保存 .vstemplate 文件并关闭编辑器。

  8. 将 .vstemplate 文件发送到新的压缩 MyProjectNode\MyProject.zip 文件夹。

  9. 在 Visual Studio 命令窗口中,键入:

    devenv /installvstemplates
    

    打开 Visual Studio。

  10. 打开“ 新建项目 ”对话框并展开 Visual C# 项目节点。

    Screenshot of the Project types folder tree in the New Project dialog box with MyProjectNode highlighted under the expanded Visual C# project node.

    MyProjectNode 在 Windows 节点下显示为 Visual C# 的子节点。