Creación de instancias de proyecto mediante generadores de proyectos

Los tipos de proyecto de Visual Studio usan un generador de proyectos para crear instancias de objetos de proyecto. Un generador de proyectos es similar a un generador de clases estándar para objetos COM cocreables. Sin embargo, los objetos de proyecto no son cocreables; solo se pueden crear mediante un generador de proyectos.

El IDE de Visual Studio llama a la factoría de proyectos implementada en VSPackage cuando un usuario carga un proyecto existente o crea un nuevo proyecto en Visual Studio. El nuevo objeto de proyecto proporciona al IDE suficiente información para rellenar Explorador de soluciones. El nuevo objeto de proyecto también proporciona las interfaces necesarias para admitir todas las acciones de interfaz de usuario pertinentes iniciadas por el IDE.

Puede implementar la IVsProjectFactory interfaz en una clase del proyecto. Normalmente, reside en su propio módulo.

Los proyectos que admiten la agregación por parte de un propietario deben conservar una clave de propietario en su archivo de proyecto. Cuando se llama al CreateProject método en un proyecto con una clave de propietario, el proyecto de propiedad convierte su clave de propietario en un GUID de generador de proyectos y, a continuación, llama al CreateProject método de esta factoría de proyectos para realizar la creación real.

Creación de un proyecto propiedad

Un propietario crea un proyecto propiedad en dos fases:

  1. Llamando al PreCreateForOwner método . Esto ofrece al proyecto propiedad la posibilidad de crear un objeto de proyecto agregado basado en la entrada que controla IUnknown. El proyecto propiedad pasa el objeto interno IUnknown y agregado al proyecto propietario. Esto ofrece al proyecto propiedad la posibilidad de almacenar el elemento interno IUnknown.

  2. Llamando al InitializeForOwner método . El proyecto propiedad realiza toda su creación de instancias cuando se llama a este método en lugar de llamar a IVsProjectFactory::CreateProject como sería el caso de los proyectos que no son propiedad. La enumeración de entrada VSOWNEDPROJECTOBJECT suele ser el proyecto de propiedad agregada. El proyecto propiedad puede usar esta variable para determinar si su objeto de proyecto ya se ha creado (cookie no es igual a NULL) o debe crearse (cookie es igual a NULL).

    Los tipos de proyecto se identifican mediante un GUID de proyecto único, similar al CLSID de un objeto COM cocreatable. Normalmente, un generador de proyectos controla la creación de instancias de un solo tipo de proyecto, aunque es posible tener un identificador de generador de proyectos más de un GUID de tipo de proyecto.

    Los tipos de proyecto están asociados a una extensión de nombre de archivo determinada. Cuando un usuario intenta abrir un archivo de proyecto existente o intenta crear un proyecto mediante la clonación de una plantilla, el IDE usa la extensión en el archivo para determinar el GUID del proyecto correspondiente.

    En cuanto el IDE determina si debe crear un nuevo proyecto o abrir un proyecto existente de un tipo determinado, el IDE usa la información del registro del sistema en [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects] para buscar qué VSPackage implementa la factoría de proyectos necesaria. El IDE carga este VSPackage. En el SetSite método , VSPackage debe registrar su generador de proyectos con el IDE llamando al RegisterProjectType método .

    El método principal de la IVsProjectFactory interfaz es CreateProject, que debe controlar dos escenarios: abrir un proyecto existente y crear un nuevo proyecto. La mayoría de los proyectos almacenan su estado de proyecto en un archivo de proyecto. Normalmente, los nuevos proyectos se crean realizando una copia del archivo de plantilla pasado al CreateProject método y, a continuación, abriendo la copia. Los proyectos existentes se crean instancias abriendo directamente el archivo de proyecto pasado al CreateProject método . El CreateProject método puede mostrar características adicionales de la interfaz de usuario al usuario según sea necesario.

    Un proyecto también puede usar ningún archivo y, en su lugar, almacenar su estado de proyecto en un mecanismo de almacenamiento distinto del sistema de archivos, como una base de datos o un servidor web. En este caso, el parámetro de nombre de archivo pasado al CreateProject método no es realmente una ruta de acceso del sistema de archivos, sino una cadena única (una dirección URL) para identificar los datos del proyecto. No es necesario copiar los archivos de plantilla que se pasan a para desencadenar la secuencia de construcción adecuada que se va a CreateProject ejecutar.