Partager via


Créer des instances de projet à l’aide de fabriques de projets

Les types de projet dans Visual Studio utilisent une fabrique de projets pour créer des instances d’objets de projet. Une fabrique de projet est similaire à une fabrique de classes standard pour les objets COM cocréables. Toutefois, les objets de projet ne sont pas cocréables ; ils ne peuvent être créés qu’à l’aide d’une fabrique de projets.

L’IDE Visual Studio appelle la fabrique de projet implémentée dans votre VSPackage lorsqu’un utilisateur charge un projet existant ou crée un projet dans Visual Studio. Le nouvel objet de projet fournit à l’IDE suffisamment d’informations pour remplir l’Explorateur de solutions. Le nouvel objet de projet fournit également les interfaces requises pour prendre en charge toutes les actions d’interface utilisateur pertinentes initiées par l’IDE.

Vous pouvez implémenter l’interface IVsProjectFactory dans une classe dans votre projet. En règle générale, il réside dans son propre module.

Les projets qui prennent en charge l’agrégation par un propriétaire doivent conserver une clé de propriétaire dans leur fichier projet. Lorsque la méthode CreateProject est appelée sur un projet avec une clé de propriétaire, le projet détenu convertit sa clé propriétaire en GUID d'usine de projets, puis appelle la méthode CreateProject sur cette usine de projets pour réaliser la création effective.

Créer un projet propriétaire

Un propriétaire crée un projet en deux phases :

  1. En appelant la méthode PreCreateForOwner. Cela donne au projet détenu la possibilité de créer un objet de projet agrégé en fonction de l'élément de contrôle d'entrée IUnknown. Le projet détenu transmet l’objet interne IUnknown et l’objet agrégé au projet propriétaire. Cela permet au projet contrôlé de stocker le contenu intérieur IUnknown.

  2. En appelant la méthode InitializeForOwner. Le projet détenu effectue toutes ses instanciations lorsque cette méthode est appelée au lieu d’appeler IVsProjectFactory::CreateProject comme cela serait le cas pour les projets qui ne sont pas détenus. L’énumération d’entrée VSOWNEDPROJECTOBJECT est généralement le projet détenu agrégé. Le projet détenu peut utiliser cette variable pour déterminer si son objet projet a déjà été créé (le cookie n’est pas égal à NULL) ou doit être créé (cookie est égal à NULL).

    Les types de projet sont identifiés par un GUID de projet unique, similaire au CLSID d’un objet COM cocréable. En règle générale, une fabrique de projet gère la création d’instances d’un type de projet unique, bien qu’il soit possible d’avoir une fabrique de projet gérer plusieurs GUID de type de projet.

    Les types de projet sont associés à une extension de nom de fichier particulière. Lorsqu’un utilisateur tente d’ouvrir un fichier projet existant ou tente de créer un projet en clonant un modèle, l’IDE utilise l’extension sur le fichier pour déterminer le GUID du projet correspondant.

    Dès que l’IDE détermine s’il doit créer un projet ou ouvrir un projet existant d’un type particulier, l’IDE utilise les informations contenues dans le Registre système sous [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects] pour trouver quel VSPackage implémente la fabrique de projet requise. L’IDE charge ce VSPackage. Dans la méthode SetSite, le VSPackage doit enregistrer sa fabrique de projet auprès de l’IDE en appelant la méthode RegisterProjectType.

    La méthode principale de l’interface IVsProjectFactory est CreateProject, qui doit gérer deux scénarios : l’ouverture d’un projet existant et la création d’un projet. La plupart des projets stockent leur état de projet dans un fichier projet. En règle générale, de nouveaux projets sont créés en effectuant une copie du fichier de modèle passé à la CreateProject méthode, puis en ouvrant la copie. Les projets existants sont instanciés en ouvrant directement le fichier projet transmis à la méthode CreateProject. La CreateProject méthode peut afficher des fonctionnalités d’interface utilisateur supplémentaires à l’utilisateur si nécessaire.

    Un projet ne peut également utiliser aucun fichier et, à la place, stocker son état de projet dans un mécanisme de stockage autre que le système de fichiers, tel qu’une base de données ou un serveur Web. Dans ce cas, le paramètre de nom de fichier transmis à la CreateProject méthode n’est pas réellement un chemin d’accès au système de fichiers, mais une chaîne unique ( une URL) pour identifier les données du projet. Vous n’avez pas besoin de copier les fichiers de modèle qui sont passés à CreateProject pour déclencher l’exécution de la séquence de construction appropriée.