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 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 CreateProject méthode est appelée sur un projet avec une clé de propriétaire, le projet détenu convertit sa clé propriétaire en GUID de fabrique de projet, puis appelle la CreateProject méthode sur cette fabrique de projet pour effectuer la création réelle.

Créer un projet détenu

Un propriétaire crée un projet appartenant à deux phases :

  1. En appelant la PreCreateForOwner méthode. Cela permet au projet détenu de créer un objet de projet agrégé en fonction du 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 donne au projet détenu une chance de stocker l’intérieur IUnknown.

  2. En appelant la InitializeForOwner méthode. 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ère 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 projets requise. L’IDE charge ce VSPackage. Dans la SetSite méthode, VSPackage doit inscrire sa fabrique de projet auprès de l’IDE en appelant la RegisterProjectType méthode.

    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 à CreateProject la méthode. 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 passés pour CreateProject déclencher l’exécution de la séquence de construction appropriée.