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

“新建项目生成:下,第一部分 ”我们看到了 “新建项目 ”对话框的填充方式。 假设你选择了 Visual C# Windows 应用程序,填写了“名称和位置”文本框,然后单击“确定”。

生成解决方案文件

选择应用程序模板会指示 Visual Studio 解压缩并打开相应的 .vstemplate 文件,并启动模板来解释此文件中的 XML 命令。 这些命令在新的或现有解决方案中创建项目和项目项。

该模板从保存 .vstemplate 文件的同一 .zip 文件夹中解压缩源文件(称为项模板)。 该模板会将这些文件复制到新项目,并相应地对其进行自定义。

模板参数替换

当模板将项模板复制到新项目时,它会将任何模板参数替换为用于自定义文件的字符串。 模板参数是一个特殊的标识符,前后都有一个美元符号,例如,$date$。

让我们看看典型的项目项模板。 提取并检查 Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip 文件夹中的Program.cs。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace $safeprojectname$
{
    static class Program
    {
        // source code deleted here for brevity
    }
}

如果创建新的名为 Simple 的 Windows 应用程序项目,模板会将 $safeprojectname$ 参数替换为项目的名称。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Simple
{
    static class Program
    {
        // source code deleted here for brevity
    }
}

有关模板参数的完整列表,请参阅 模板参数

深入了解 .VSTemplate 文件

基本 .vstemplate 文件具有此格式

<VSTemplate Version="2.0.0"     xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"     Type="Project">
    <TemplateData>
    </TemplateData>
    <TemplateContent>
    </TemplateContent>
</VSTemplate>

我们查看了 <新项目生成:幕后揭密,第一部分> 中的 TemplateData 部分。 本部分中的标记用于控制 “新建项目 ”对话框的外观。

TemplateContent< 节中的>标记控制新项目和项目项的生成。 下面是 <\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip 文件夹中 cswindowsapplication.vstemplate 文件中的 TemplateContent> 部分。

<TemplateContent>
  <Project File="WindowsApplication.csproj" ReplaceParameters="true">
    <ProjectItem ReplaceParameters="true"
      TargetFileName="Properties\AssemblyInfo.cs">
      AssemblyInfo.cs
    </ProjectItem>
    <ProjectItem TargetFileName="Properties\Resources.resx">
      Resources.resx
    </ProjectItem>
    <ProjectItem ReplaceParameters="true"       TargetFileName="Properties\Resources.Designer.cs">
      Resources.Designer.cs
    </ProjectItem>
    <ProjectItem TargetFileName="Properties\Settings.settings">
      Settings.settings
    </ProjectItem>
    <ProjectItem ReplaceParameters="true"       TargetFileName="Properties\Settings.Designer.cs">
      Settings.Designer.cs
    </ProjectItem>
    <ProjectItem ReplaceParameters="true" OpenInEditor="true">
      Form1.cs
    </ProjectItem>
    <ProjectItem ReplaceParameters="true">
      Form1.Designer.cs
    </ProjectItem>
    <ProjectItem ReplaceParameters="true">
      Program.cs
    </ProjectItem>
  </Project>
</TemplateContent>

<Project> 标记控制项目的生成,<ProjectItem> 标记控制项目项的生成。 如果参数 ReplaceParameters 为 true,则模板将自定义项目文件或项中的所有模板参数。 在这种情况下,除 Settings.settings 之外,所有项目项均已自定义。

TargetFileName 参数指定生成的项目文件或项的名称和相对路径。 这样,便可以为项目创建文件夹结构。 如果未指定此参数,则项目项的名称将与项目项模板相同。

生成的 Windows 应用程序文件夹结构如下所示:

Visual Studio 解决方案资源管理器中“简单”解决方案的 Windows 应用程序文件夹结构的屏幕截图。

模板中的第<一个且唯一的 Project>标签为:

<Project File="WindowsApplication.csproj" ReplaceParameters="true">

这将指示新建项目模板通过复制和自定义模板项 windowsapplication.csproj 来创建 Simple.csproj 项目文件。

设计师和引用

可以在解决方案资源管理器中看到“属性”文件夹存在并包含预期的文件。 但是,像 Resources.Designer.cs 到 Resources.resx 以及 Form1.Designer.cs 到 Form1.cs 这样的项目引用和设计器文件依赖项呢? 在生成 Simple.csproj 文件时进行设置。

下面是 <Simple.csproj 中的 ItemGroup> ,用于创建项目引用:

<ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Deployment" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
</ItemGroup>

可以看到这些是解决方案资源管理器中显示的六个项目引用。 下面是另一 <ItemGroup> 的部分。 为了清楚起见,许多代码行已被删除。 本部分使Settings.Designer.cs依赖于 Settings.settings:

<ItemGroup>
    <Compile Include="Properties\Settings.Designer.cs">
        <DependentUpon>Settings.settings</DependentUpon>
    </Compile>
</ItemGroup>