Compartir a través de


Actualización de proyectos

Los cambios en el modelo de proyecto de una versión de Visual Studio a la siguiente pueden requerir que los proyectos y soluciones se actualicen para que se puedan ejecutar en la versión más reciente. El SDK de Visual Studio proporciona interfaces que se pueden usar para implementar la compatibilidad con la actualización en sus propios proyectos.

Estrategias de actualización

Para admitir una actualización, la implementación del sistema del proyecto debe definir e implementar una estrategia de actualización. Para determinar la estrategia, puede optar por admitir copias de seguridad en paralelo (SxS), copiar copias de seguridad o ambas.

  • La copia de seguridad de SxS significa que un proyecto copia solo los archivos que necesitan actualizarse, agregando un sufijo de nombre de archivo adecuado, por ejemplo, ".old".

  • Copia de seguridad significa que un proyecto copia todos los elementos del proyecto en una ubicación de copia de seguridad proporcionada por el usuario. A continuación, se actualizan los archivos pertinentes en la ubicación original del proyecto.

Cómo funciona la actualización

Cuando se abre una solución creada en una versión anterior de Visual Studio en una versión más reciente, el IDE comprueba el archivo de solución para determinar si necesita actualizarse. Si se requiere la actualización, el Asistente para actualización se inicia automáticamente para guiar al usuario a través del proceso de actualización.

Cuando una solución necesita actualizar, consulta cada generador de proyectos para su estrategia de actualización. La estrategia determina si la fábrica de proyectos admite la copia de seguridad o la copia de seguridad en paralelo. La información se envía al Asistente para actualización, que recopila la información necesaria para la copia de seguridad y presenta las opciones aplicables al usuario.

Soluciones de varios proyectos

Si una solución contiene varios proyectos y las estrategias de actualización difieren, como cuando un proyecto de C++ que solo admite la copia de seguridad de SxS y un proyecto web que solo admite la copia de seguridad, los generadores de proyectos deben negociar la estrategia de actualización.

La solución consulta cada generador de proyectos para IVsProjectUpgradeViaFactory. A continuación, llama a UpgradeProject_CheckOnly para ver si los archivos de proyecto globales necesitan ser actualizados y para verificar las estrategias de actualización admitidas. A continuación, se invoca al Asistente para actualización .

Cuando el usuario complete el asistente, UpgradeProject se invoca en cada fábrica de proyectos para realizar la actualización real. Para facilitar la copia de seguridad, los métodos IVsProjectUpgradeViaFactory proporcionan el servicio SVsUpgradeLogger para registrar los detalles del proceso de mejora. Este servicio no se puede almacenar en caché.

Después de actualizar todos los archivos globales pertinentes, cada generador de proyectos puede elegir crear instancias de un proyecto. La implementación del proyecto debe admitir IVsProjectUpgrade. Se llama luego al método UpgradeProject para actualizar todos los elementos de proyecto pertinentes.

Nota:

El UpgradeProject método no proporciona el servicio SVsUpgradeLogger. Este servicio se puede obtener llamando a QueryService.

Procedimientos recomendados

Utiliza el SVsQueryEditQuerySave servicio para comprobar si puedes editar un archivo antes de hacerlo y si puedes guardarlo antes de hacerlo. Esto ayudará a sus implementaciones de copia de seguridad y actualización a manejar archivos de proyecto bajo control de versiones, archivos con permisos insuficientes, y así sucesivamente.

Use el SVsUpgradeLogger servicio durante todas las fases de copia de seguridad y actualización para proporcionar información sobre el éxito o error del proceso de actualización.

Para obtener más información sobre la copia de seguridad y actualización de proyectos, vea los comentarios de IVsProjectUpgrade en vsshell2.idl.

Actualización de proyectos personalizados

Si cambia la información que se conserva en el archivo de proyecto entre diferentes versiones de Visual Studio del producto, debe admitir la actualización del archivo del proyecto desde la versión anterior a la nueva. Para admitir la actualización que le permite participar en el Asistente para conversión de Visual Studio, implemente la interfaz IVsProjectUpgradeViaFactory. Esta interfaz contiene el único mecanismo disponible para la actualización de copias. La actualización del proyecto ocurre cuando se abre la solución. La IVsProjectUpgradeViaFactory interfaz se implementa mediante el generador de proyectos o al menos debe obtenerse del generador de proyectos.

El mecanismo antiguo que usa la IVsProjectUpgrade interfaz sigue siendo compatible, pero conceptualmente actualiza el sistema del proyecto como parte del proyecto abierto. Por lo tanto, el entorno de Visual Studio llama a la interfaz IVsProjectUpgrade incluso si se llama o se implementa la interfaz IVsProjectUpgradeViaFactory. Este enfoque permite usar IVsProjectUpgradeViaFactory para implementar solo las partes de copia y proyección de la actualización y delegar el resto del trabajo para realizarlo en contexto (posiblemente en la nueva ubicación) mediante la interfaz IVsProjectUpgrade.

Para obtener una implementación de ejemplo de IVsProjectUpgrade, consulte Ejemplos de VSSDK.

Los escenarios siguientes surgen con las actualizaciones del proyecto:

  • Si el archivo tiene un formato más reciente que el proyecto puede admitir, debe devolver un error que indique esto. Esto supone que la versión anterior del producto incluye código para comprobar la versión.

  • Si se especifica la PUVFF_SXSBACKUP marca en el método UpgradeProject, la actualización se implementará como una actualización in situ antes de la apertura del proyecto.

  • Si la PUVFF_COPYBACKUP marca se especifica en el UpgradeProject método , la actualización se implementa como una actualización de copia.

  • Si la UPF_SILENTMIGRATE marca se especifica en la UpgradeProject llamada, el entorno le pedirá al usuario que actualice el archivo del proyecto como una actualización local después de abrir el proyecto. Por ejemplo, el entorno solicita al usuario que actualice cuando el usuario abra una versión anterior de la solución.

  • Si no se especifica la UPF_SILENTMIGRATE marca en la UpgradeProject llamada, debe solicitar al usuario que actualice el archivo del proyecto.

    A continuación se muestra un mensaje de solicitud de actualización de ejemplo:

    "El proyecto "%1" se creó con una versión anterior de Visual Studio. Si la abre con esta versión de Visual Studio, es posible que no pueda abrirla con versiones anteriores de Visual Studio. ¿Desea continuar y abrir este proyecto?"

Para implementar IVsProjectUpgradeViaFactory

  1. Implemente el método de la IVsProjectUpgradeViaFactory interfaz, específicamente el método UpgradeProject en su implementación de fábrica de proyectos, o haga que las implementaciones sean invocables desde su implementación de fábrica de proyectos.

  2. Si desea realizar una actualización in situ como parte de la apertura de la solución, proporcione la marca PUVFF_SXSBACKUP como el parámetro VSPUVF_FLAGS en su implementación UpgradeProject.

  3. Si desea realizar una actualización in situ como parte de la apertura de la solución, utilice la marca PUVFF_COPYBACKUP como el parámetro VSPUVF_FLAGS en su implementación UpgradeProject.

  4. Para los pasos 2 y 3, los pasos de actualización de archivos reales, mediante IVsQueryEditQuerySave2, se pueden implementar como se describe en la sección "Implementación IVsProjectUpgade" a continuación, o puede delegar la actualización de archivos real a IVsProjectUpgrade.

  5. Use los métodos de IVsUpgradeLogger para publicar mensajes relacionados con la actualización para el usuario mediante el Asistente para migración de Visual Studio.

  6. IVsFileUpgrade la interfaz se usa para implementar cualquier tipo de actualización de archivos que necesite producirse como parte de la actualización del proyecto. No se llama a esta interfaz desde IVsProjectUpgradeViaFactory, sino que se proporciona como un mecanismo para actualizar archivos que forman parte del sistema de proyectos, aunque el sistema de proyectos principal puede no estar directamente al tanto de ello. Por ejemplo, esta situación podría surgir si el mismo equipo de desarrollo no controla los archivos y propiedades relacionados con el compilador que controla el resto del sistema del proyecto.

Implementación de IVsProjectUpgrade

Si el sistema del proyecto solo implementa IVsProjectUpgrade , no puede participar en el Asistente para conversión de Visual Studio. Sin embargo, aunque implemente la IVsProjectUpgradeViaFactory interfaz, todavía puede delegar la actualización de archivos a la implementación de IVsProjectUpgrade.

Para implementar IVsProjectUpgrade

  1. Cuando un usuario intenta abrir un proyecto, el método UpgradeProject es llamado por el entorno después de que se abra el proyecto y antes de que se pueda realizar cualquier otra acción del usuario en el proyecto. Si ya se le ha indicado al usuario que actualice la solución, el indicador UPF_SILENTMIGRATE se pasa en el parámetro grfUpgradeFlags. Si el usuario abre un proyecto directamente, como mediante el comando Agregar proyecto existente, el indicador UPF_SILENTMIGRATE no se pasa y el proyecto debe pedir al usuario que lo actualice.

  2. En respuesta a la UpgradeProject llamada, el proyecto debe evaluar si se actualiza el archivo del proyecto. Si el proyecto no necesita actualizar el tipo de proyecto a una nueva versión, simplemente puede devolver la S_OK marca .

  3. Si el proyecto necesita actualizar el tipo de proyecto a una nueva versión, debe determinar si el archivo del proyecto se puede modificar llamando al QueryEditFiles método y pasando un valor de tagVSQueryEditFlags para el rgfQueryEdit parámetro . A continuación, el proyecto debe hacer lo siguiente:

  4. Si la QueryEditFiles llamada al archivo del proyecto causa que el archivo se desprotege y se recupere la versión más reciente, entonces el proyecto se descarga de la memoria y se vuelve a cargar. Se vuelve a llamar al UpgradeProject método una vez que se crea otra instancia del proyecto. En esta segunda llamada, el archivo del proyecto se puede escribir en el disco; se recomienda que el proyecto guarde una copia del archivo del proyecto en el formato anterior con una extensión .OLD, haga los cambios de actualización necesarios y guarde el archivo del proyecto en el nuevo formato. De nuevo, si se produce un error en alguna parte del proceso de actualización, el método debe indicar un error devolviendo VS_E_PROJECTMIGRATIONFAILED. Esto hace que el proyecto se descargue en el Explorador de soluciones.

    Es importante comprender el proceso completo que ocurre en el entorno para el caso en el que la llamada al método QueryEditFiles (especificando un valor de ReportOnly) devuelve las banderas QER_EditNotOK y QER_ReadOnlyUnderScc.

  5. El usuario intenta abrir el archivo del proyecto.

  6. El entorno llama a tu CanCreateProject implementación.

  7. Si CanCreateProject devuelve true, entonces el entorno llama a tu CanCreateProject implementación.

  8. El entorno llama a la Load implementación para abrir el archivo e inicializar el objeto de proyecto, por ejemplo, Project1.

  9. El entorno llama a la IVsProjectUpgrade::UpgradeProject implementación para determinar si es necesario actualizar el archivo del proyecto.

  10. Llame QueryEditFiles y pase un valor de QEF_ReportOnly al parámetro rgfQueryEdit.

  11. El entorno devuelve QER_EditNotOK para VSQueryEditResult y el bit QER_ReadOnlyUnderScc se establece en VSQueryEditResultFlags.

  12. La implementación IVsProjectUpgrade llama a IVsQueryEditQuerySave::QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits).

Esta llamada puede hacer que se realice la extracción de una nueva copia del archivo de proyecto y se recupere la versión más reciente, así como la necesidad de volver a cargar el archivo de proyecto. En este momento, sucede una de estas dos cosas:

  • Si usted gestiona la recarga de su propio proyecto, el entorno llama la implementación de la (VSITEMID_ROOT). Cuando reciba esta llamada, vuelva a cargar la primera instancia del proyecto (Project1) y continúe actualizando el archivo del proyecto. El entorno sabe que gestiona la recarga de su propio proyecto si devuelve true en lugar de GetProperty (VSHPROPID_HandlesOwnReload).

  • Si no gestiona la recarga de su propio proyecto, entonces devuelve false para GetProperty (VSHPROPID_HandlesOwnReload). En este caso, antes de queQueryEditFiles(QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits) se devuelva, el entorno crea una nueva instancia de su proyecto, por ejemplo, Project2, como sigue:

    1. El entorno llama Close a en el primer objeto de proyecto, Project1, colocando este objeto en estado inactivo.

    2. El entorno llama a su implementación IVsProjectFactory::CreateProject para crear una segunda instancia de tu proyecto, Project2.

    3. El entorno llama a la IPersistFileFormat::Load implementación para abrir el archivo e inicializar el segundo objeto de proyecto, Project2.

    4. El entorno llama IVsProjectUpgrade::UpgradeProject por segunda vez para determinar si se debe actualizar el objeto del proyecto. Sin embargo, esta llamada se realiza en una nueva, segunda instancia del proyecto, Project2. Este es el proyecto que está abierto en la solución.

      Nota:

      En el caso de que su primer proyecto, Project1, esté en estado inactivo, usted debe devolver S_OK de la primera llamada de su implementación de UpgradeProject.

    5. Llame QueryEditFiles y pase un valor de QEF_ReportOnly al parámetro rgfQueryEdit.

    6. El entorno devuelve QER_EditOK y la actualización puede continuar porque se puede escribir el archivo del proyecto.

Si no logra actualizar, devuelva VS_E_PROJECTMIGRATIONFAILED de IVsProjectUpgrade::UpgradeProject. Si no es necesaria ninguna actualización o decide no actualizar, trate la IVsProjectUpgrade::UpgradeProject llamada como una no-op. Si devuelve VS_E_PROJECTMIGRATIONFAILED, se agrega un nodo de marcador de posición a la solución para el proyecto.

Actualización de elementos de proyecto

Si agrega o administra elementos dentro de los sistemas de proyecto que no implementa, es posible que tenga que participar en el proceso de actualización del proyecto. Crystal Reports es un ejemplo de un elemento que se puede agregar al sistema de proyecto.

Normalmente, los implementadores de elementos de proyecto quieren aprovechar un proyecto completamente instanciado y actualizado puesto que necesitan saber cuáles son las referencias del proyecto y qué otras propiedades del proyecto existen para tomar una decisión de actualización.

Para obtener la notificación de actualización del proyecto

  1. Establezca la SolutionOrProjectUpgrading marca (definida en vsshell80.idl) en la implementación del elemento de proyecto. Esto hace que el elemento de proyecto VSPackage se cargue automáticamente cuando el shell de Visual Studio determina que un sistema de proyecto está en proceso de actualización.

  2. Indica la interfaz IVsSolutionEventsProjectUpgrade mediante el método AdviseSolutionEvents.

  3. La IVsSolutionEventsProjectUpgrade interfaz se activa después de que la implementación del sistema del proyecto haya completado sus operaciones de actualización y se cree el proyecto actualizado. En función del escenario, IVsSolutionEventsProjectUpgrade se desencadena después de OnAfterOpenSolution, OnAfterOpenProject o los métodos OnAfterLoadProject.

Para actualizar los archivos de elementos de proyecto

  1. Debe administrar cuidadosamente el proceso de copia de seguridad de archivos en la implementación del elemento de proyecto. Esto se aplica en particular a una copia de seguridad en paralelo, donde el fUpgradeFlag parámetro del UpgradeProject método se establece en PUVFF_SXSBACKUP; donde los archivos de los que se ha realizado una copia de seguridad se colocan junto a los archivos designados como ".old". Los archivos de copia de seguridad anteriores a la hora del sistema en que se actualizó el proyecto se pueden designar como obsoletos. Además, pueden sobrescribirse a menos que tome medidas específicas para evitarlo.

  2. En el momento en que el elemento del proyecto recibe una notificación de la actualización del proyecto, todavía se muestra el Asistente para conversión de Visual Studio . Por lo tanto, debe usar los métodos de la interfaz IVsUpgradeLogger para proporcionar mensajes de actualización a la UI del asistente.