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

Vous avez déjà pensé à la création de votre propre type de projet ? Vous vous demandez ce qui se passe réellement quand vous créez un projet ? Prenons un aperçu sous le capot et voyons ce qui se passe vraiment.

Il existe plusieurs tâches que Visual Studio coordonne pour vous :

  • Il affiche une arborescence de tous les types de projets disponibles.

  • Il affiche une liste de modèles d’application pour chaque type de projet et vous permet de en choisir un.

  • Il collecte des informations de projet pour l’application, telles que le nom et le chemin d’accès du projet.

  • Il transmet ces informations à la fabrique de projets.

  • Il génère des éléments et des dossiers de projet dans la solution actuelle.

Boîte de dialogue Nouveau projet

Tout commence lorsque vous sélectionnez un type de projet pour un nouveau projet. Commençons par cliquer sur Nouveau projet dans le menu Fichier . La boîte de dialogue Nouveau projet s’affiche, qui ressemble à ceci :

Screenshot of the New Project dialog box.

Voyons cela de plus près. L’arborescence des types de projets répertorie les différents types de projet que vous pouvez créer. Lorsque vous sélectionnez un type de projet tel que Visual C# Windows, vous verrez une liste de modèles d’application pour vous aider à démarrer. Les modèles installés par Visual Studio sont installés par Visual Studio et sont disponibles pour n’importe quel utilisateur de votre ordinateur. Les nouveaux modèles que vous créez ou collectez peuvent être ajoutés à Mes modèles et sont disponibles uniquement pour vous.

Lorsque vous sélectionnez un modèle tel que l’application Windows, une description du type d’application apparaît dans la boîte de dialogue ; dans ce cas, projet de création d’une application avec une interface utilisateur Windows.

En bas de la boîte de dialogue Nouveau projet , vous verrez plusieurs contrôles qui recueillent plus d’informations. Les contrôles que vous voyez dépendent du type de projet, mais généralement ils incluent une zone de texte Nom du projet, une zone de texte Emplacement et un bouton Parcourir associé, ainsi qu’une zone de texte Nom de solution et un répertoire Créer un répertoire associé pour la solution case activée zone.

Remplissage de la boîte de dialogue Nouveau projet

À partir de laquelle la boîte de dialogue Nouveau projet obtient-elle ses informations ? Il y a deux mécanismes au travail ici, l’un d’entre eux déconseillé. La boîte de dialogue Nouveau projet combine et affiche les informations obtenues à partir des deux mécanismes.

La méthode plus ancienne (déconseillée) utilise des entrées de Registre système et des fichiers .vsdir. Ce mécanisme s’exécute lors de l’ouverture de Visual Studio. La méthode la plus récente utilise des fichiers .vstemplate. Ce mécanisme s’exécute lorsque Visual Studio est initialisé, par exemple, en exécutant

devenv /setup

or

devenv /installvstemplates

Types de projet

La position et les noms des nœuds racines de types Project, tels que Visual C# et Autres langages, sont déterminés par les entrées de Registre système. L’organisation des nœuds enfants, tels que la base de données et l’appareil intelligent, miroir la hiérarchie des dossiers qui contiennent les fichiers .vstemplate correspondants. Examinons d’abord les nœuds racines.

Nœuds racines de type de projet

Lorsque Visual Studio est initialisé, il traverse les sous-clés de la clé de Registre système HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs pour générer et nommer les nœuds racines de l’arborescence des types de projets . Ces informations sont mises en cache pour une utilisation ultérieure. Examinez les TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1 clé. Chaque entrée est un GUID VSPackage. Le nom de la sous-clé (/1) est ignoré, mais sa présence indique qu’il s’agit d’un nœud racine de type Projet. Un nœud racine peut à son tour avoir plusieurs sous-clés qui contrôlent son apparence dans l’arborescence des types de projets. Examinons certains d’entre eux.

(Par défaut)

Il s’agit de l’ID de ressource de la chaîne localisée qui nomme le nœud racine. La ressource de chaîne se trouve dans la DLL satellite sélectionnée par le GUID VSPackage.

Dans l’exemple, le GUID VSPackage est

{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}

et l’ID de ressource (valeur par défaut) du nœud racine (/1) est #2345

Si vous recherchez le GUID dans la clé packages à proximité et examinez la sous-clé SatelliteDll, vous trouverez le chemin d’accès de l’assembly qui contient la ressource de chaîne :

<Chemin> d’installation de Visual Studio\VC#\VCSPackages\1033\csprojui.dll

Pour vérifier cela, ouvrez le Explorateur de fichiers et faites glisser csprojui.dll dans le répertoire Visual Studio.. La table de chaînes indique que la ressource #2345 a la légende Visual C#.

SortPriority

Cela détermine la position du nœud racine dans l’arborescence des types de projet.

SortPriority REG_DWORD 0x00000014 (20)

Plus le nombre de priorité est inférieur, plus la position est élevée dans l’arborescence.

DeveloperActivity

Si cette sous-clé est présente, la position du nœud racine est contrôlée par la boîte de dialogue Développeur Paramètres. Par exemple,

DeveloperActivity REG_SZ VC#

indique que Visual C# sera un nœud racine si Visual Studio est défini pour le développement Visual C++. Sinon, il s’agit d’un nœud enfant d’autres langues.

Dossier

Si cette sous-clé est présente, le nœud racine devient un nœud enfant du dossier spécifié. Une liste de dossiers possibles apparaît sous la clé

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders

Par exemple, l’entrée Projets de base de données a une clé de dossier qui correspond à l’entrée Autres types de projets dans PseudoFolders. Par conséquent, dans l’arborescence des types de projet, les projets de base de données sont un nœud enfant d’autres types de projets.

Fichiers .vstdir et nœuds enfants de type projet

La position des nœuds enfants dans l’arborescence des types Project suit la hiérarchie des dossiers dans les dossiers ProjectTemplates. Pour les modèles d’ordinateur (modèles installés par Visual Studio), l’emplacement classique est \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\ et pour les modèles utilisateur (Mes modèles), l’emplacement typique est \Mes documents\Visual Studio 14.0\Templates\ProjectTemplates\. Les hiérarchies de dossiers de ces deux emplacements sont fusionnées pour créer l’arborescence des types de projets .

Pour Visual Studio avec les paramètres du développeur C#, l’arborescence des types de projets ressemble à ceci :

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

Le dossier ProjectTemplates correspondant ressemble à ceci :

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

Lorsque la boîte de dialogue Nouveau projet s’ouvre, Visual Studio traverse le dossier ProjectTemplates et recrée sa structure dans l’arborescence des types project avec quelques modifications :

  • Le nœud racine de l’arborescence des types de projet est déterminé par le modèle d’application.

  • Le nom du nœud peut être localisé et peut contenir des caractères spéciaux.

  • L’ordre de tri peut être modifié.

Recherche du nœud racine pour un type de projet

Lorsque Visual Studio traverse les dossiers ProjectTemplates, il ouvre tous les fichiers .zip et extrait tous les fichiers .vstemplate. Un fichier .vstemplate utilise du code XML pour décrire un modèle d’application. Pour plus d’informations, consultez Nouvelle génération de projet : sous le capot, deuxième partie.

La <balise ProjectType> détermine le type de projet de l’application. Par exemple, le fichier \CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip contient un fichier EmptyProject.vstemplate qui a cette balise :

<ProjectType>CSharp</ProjectType>

La <balise ProjectType> , et non le sous-dossier du dossier ProjectTemplates, détermine le nœud racine d’une application dans l’arborescence des types de projets. Dans l’exemple, les applications Windows CE apparaissent sous le nœud racine Visual C# , et même si vous deviez déplacer le dossier WindowsCE vers le dossier VisualBasic, les applications Windows CE apparaissent toujours sous le nœud racine Visual C# .

Localisation du nom du nœud

Lorsque Visual Studio traverse les dossiers ProjectTemplates, il examine tous les fichiers .vstdir qu’il trouve. Un fichier .vstdir est un fichier XML qui contrôle l’apparence du type de projet dans la boîte de dialogue Nouveau projet . Dans le fichier .vstdir, utilisez la <balise LocalizedName> pour nommer le nœud types project.

Par exemple, le fichier \CSharp\Database\TemplateIndex.vstdir contient cette balise :

<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>

Cela détermine la DLL satellite et l’ID de ressource de la chaîne localisée qui nomme le nœud racine, dans ce cas, Database. Le nom localisé peut contenir des caractères spéciaux qui ne sont pas disponibles pour les noms de dossiers, tels que .NET.

Si aucune balise LocalizedName n’est <présente, le type de projet est nommé par le dossier lui-même, Smart Téléphone 2003.>

Recherche de l’ordre de tri d’un type de projet

Pour déterminer l’ordre de tri du type de projet, les fichiers .vstdir utilisent la <balise SortOrder> .

Par exemple, le fichier \CSharp\Windows.vstdir contient cette balise :

<SortOrder>5</SortOrder>

Le fichier \CSharp\Database\TemplateIndex.vstdir a une balise avec une valeur supérieure :

<SortOrder>5000</SortOrder>

Plus le nombre est inférieur à la <balise SortOrder> , plus la position dans l’arborescence est élevée, de sorte que le nœud Windows apparaît plus haut que le nœud base de données dans l’arborescence des types de projets.

Si aucune balise SortOrder n’est <spécifiée pour un type de projet, elle apparaît dans l’ordre alphabétique suivant les types de projet qui contiennent des <spécifications SortOrder>.>

Notez qu’il n’existe aucun fichier .vstdir dans les dossiers Mes documents (Mes modèles). Les noms de type de projet d’application utilisateur ne sont pas localisés et apparaissent par ordre alphabétique.

Un examen rapide

Modifions la boîte de dialogue Nouveau projet et créons un modèle de projet utilisateur.

  1. Ajoutez un sous-dossier MyProjectNode au dossier \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp.

  2. Créez un fichier MyProject.vstdir dans le dossier MyProjectNode à l’aide de n’importe quel éditeur de texte.

  3. Ajoutez ces lignes au fichier .vstdir :

    <TemplateDir Version="1.0.0">
        <SortOrder>6</SortOrder>
    </TemplateDir>
    
  4. Enregistrez et fermez le fichier .vstdir.

  5. Créez un fichier MyProject.vstemplate dans le dossier MyProjectNode à l’aide de n’importe quel éditeur de texte.

  6. Ajoutez ces lignes au fichier .vstemplate :

    <VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
        <TemplateData>
            <ProjectType>CSharp</ProjectType>
        </TemplateData>
    </VSTemplate>
    
  7. Enregistrez le fichier.vstemplate et fermez l’éditeur.

  8. Envoyez le fichier .vstemplate à un nouveau dossier MyProjectNode\MyProject.zip compressé.

  9. Dans la fenêtre de commande Visual Studio, tapez :

    devenv /installvstemplates
    

    Ouvrez Visual Studio.

  10. Ouvrez la boîte de dialogue Nouveau projet et développez le nœud de projet 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 apparaît en tant que nœud enfant de Visual C# juste sous le nœud Windows.