Nouvelle génération de projet : Rouages du système, seconde partie

Dans Nouvelle génération de projet : sous le capot, la première partie nous a vu comment la boîte de dialogue Nouveau projet est remplie. Supposons que vous avez sélectionné une application Windows Visual C#, rempli les zones de texte Nom et Emplacement , puis que vous avez cliqué sur OK.

Génération des fichiers de solution

Le choix d’un modèle d’application indique à Visual Studio de décompresser et d’ouvrir le fichier .vstemplate correspondant et de lancer un modèle pour interpréter les commandes XML dans ce fichier. Ces commandes créent des projets et des éléments de projet dans la solution nouvelle ou existante.

Le modèle décompresse les fichiers sources, appelés modèles d’élément, à partir du même dossier .zip qui contient le fichier .vstemplate. Le modèle copie ces fichiers dans le nouveau projet, en les personnalisant en conséquence.

Remplacement des paramètres de modèle

Lorsque le modèle copie un modèle d’élément dans un nouveau projet, il remplace tous les paramètres de modèle par des chaînes pour personnaliser le fichier. Un paramètre de modèle est un jeton spécial précédé et suivi d’un signe dollar, par exemple, $date$.

Examinons un modèle d’élément de projet classique. Extrayez et examinez Program.cs dans le dossier Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip.

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

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

Si vous créez un projet d’application Windows nommé Simple, le modèle remplace le $safeprojectname$ paramètre par le nom du projet.

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

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

Pour obtenir une liste exhaustive des paramètres de modèle, consultez Paramètres de modèle.

Un regard à l’intérieur d’un . Fichier VSTemplate

Un fichier .vstemplate de base a ce format

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

Nous avons examiné la <section TemplateData> de la nouvelle génération de projet : Sous le capot, partie 1. Les balises de cette section sont utilisées pour contrôler l’apparence de la boîte de dialogue Nouveau projet .

Les balises de la <section TemplateContent> contrôlent la génération de nouveaux projets et éléments de projet. Voici la <section TemplateContent> du fichier cswindowsapplication.vstemplate dans le dossier \Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WindowsApplication.zip.

<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>

La <balise Project> contrôle la génération d’un projet, et la <balise ProjectItem> contrôle la génération d’un élément de projet. Si le paramètre ReplaceParameters a la valeur true, le modèle personnalise tous les paramètres de modèle dans le fichier ou l’élément du projet. Dans ce cas, tous les éléments de projet sont personnalisés, à l’exception de Paramètres.settings.

Le paramètre TargetFileName spécifie le nom et le chemin d’accès relatif du fichier ou de l’élément projet résultant. Cela vous permet de créer une structure de dossiers pour votre projet. Si vous ne spécifiez pas cet argument, l’élément de projet aura le même nom que le modèle d’élément de projet.

La structure de dossiers d’application Windows résultante ressemble à ceci :

Screenshot of the Windows application folder structure for the 'Simple' Solution in the Visual Studio Solution Explorer.

La première et seule <balise Project> dans le modèle lit :

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

Cela indique au nouveau modèle de projet de créer le fichier projet Simple.csproj en copiant et en personnalisant l’élément de modèle windowsapplication.csproj.

Concepteurs et références

Vous pouvez voir dans le Explorateur de solutions que le dossier Propriétés est présent et contient les fichiers attendus. Mais qu’en est-il des références de projet et des dépendances de fichiers de concepteur, telles que Resources.Designer.cs à Resources.resx et Form1.Designer.cs à Form1.cs ? Ceux-ci sont configurés dans le fichier Simple.csproj lorsqu’il est généré.

Voici le <ItemGroup> de Simple.csproj qui crée les références de projet :

<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>

Vous pouvez voir qu’il s’agit des six références de projet qui apparaissent dans la Explorateur de solutions. Voici une section d’un autre <ItemGroup>. De nombreuses lignes de code ont été supprimées pour plus de clarté. Cette section rend Paramètres. Designer.cs dépendant de Paramètres.settings :

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