Administración de la carga de proyectos en una solución

Las soluciones de Visual Studio pueden contener un gran número de proyectos. El comportamiento predeterminado de Visual Studio es cargar todos los proyectos de una solución en el momento en que se abre la solución y no permitir que el usuario acceda a ninguno de los proyectos hasta que todos hayan terminado de cargarse. Cuando el proceso de carga del proyecto dura más de dos minutos, se muestra una barra de progreso que muestra el número de proyectos cargados y el número total de proyectos. El usuario puede descargar proyectos mientras trabaja en una solución con varios proyectos, pero este procedimiento tiene algunas desventajas: los proyectos descargados no se compilan como parte de un comando Rebuild Solution y no se muestran las descripciones de IntelliSense de tipos y miembros de proyectos cerrados.

Los desarrolladores pueden reducir los tiempos de carga de la solución y administrar el comportamiento de carga de proyectos mediante la creación de un administrador de carga de soluciones. El administrador de carga de soluciones puede asegurarse de que los proyectos se cargan antes de iniciar una compilación en segundo plano, retrasar la carga en segundo plano hasta que se completen otras tareas en segundo plano y realizar otras tareas de administración de carga de proyectos.

Creación de un administrador de carga de soluciones

Los desarrolladores pueden crear un administrador de carga de soluciones mediante la implementación IVsSolutionLoadManager y asesoramiento a Visual Studio de que el administrador de carga de soluciones está activo.

Activación de un administrador de carga de soluciones

Visual Studio solo permite un administrador de carga de soluciones en un momento dado, por lo que debe avisar a Visual Studio cuando quiera activar el administrador de carga de soluciones. Si se activa un segundo administrador de carga de soluciones más adelante, el administrador de carga de soluciones se desconectará.

Debe obtener el SVsSolution servicio y establecer el __VSPROPID4. VSPROPID_ActiveSolutionLoadManager propiedad:

IVsSolution pSolution = GetService(typeof(SVsSolution)) as IVsSolution;
object objLoadMgr = this;   //the class that implements IVsSolutionManager
pSolution.SetProperty((int)__VSPROPID4.VSPROPID_ActiveSolutionLoadManager, objLoadMgr);

Se OnDisconnect llama al método cuando Se apaga Visual Studio o cuando se ha tomado el control de un paquete diferente como administrador de carga de soluciones activa mediante una llamada a SetProperty con el __VSPROPID4. VSPROPID_ActiveSolutionLoadManager propiedad.

Estrategias para diferentes tipos de administrador de carga de soluciones

Puede implementar administradores de carga de soluciones de diferentes maneras, en función de los tipos de soluciones que estén diseñados para administrar.

Si el administrador de carga de soluciones está pensado para administrar la carga de soluciones en general, se puede implementar como parte de un VSPackage. El paquete debe establecerse en autoload agregando en ProvideAutoLoadAttribute VSPackage con un valor de SolutionOpening_guid. A continuación, el administrador de carga de soluciones se puede activar en el Initialize método .

Nota:

Para obtener más información sobre la carga automática de paquetes, consulte Carga de VSPackages.

Dado que Visual Studio reconoce solo el último administrador de carga de soluciones que se va a activar, los administradores de carga de soluciones generales siempre deben detectar si hay un administrador de carga existente antes de activarse por sí mismos. Si llama a GetProperty() en el servicio de solución para __VSPROPID4. VSPROPID_ActiveSolutionLoadManager devuelve null, no hay ningún administrador de carga de soluciones activo. Si no devuelve null, compruebe si el objeto es el mismo que el administrador de carga de soluciones.

Si el administrador de carga de soluciones está diseñado para administrar solo algunos tipos de solución, VSPackage puede suscribirse a eventos de carga de soluciones (llamando AdviseSolutionEventsa ) y usar el controlador de eventos para OnBeforeOpenSolution activar el administrador de carga de soluciones.

Si el administrador de carga de soluciones está diseñado para administrar solo soluciones específicas, la información de activación se puede conservar como parte del archivo de solución mediante una llamada a WriteSolutionProps para la sección anterior a la solución.

Los administradores de carga de soluciones específicos deben desactivarse en el OnAfterCloseSolution controlador de eventos para no entrar en conflicto con otros administradores de carga de soluciones.

Si necesita un administrador de carga de soluciones solo para conservar las propiedades globales de carga del proyecto (por ejemplo, las propiedades establecidas en una página Opciones), puede activar el administrador de carga de soluciones en el OnAfterOpenProject controlador de eventos, conservar la configuración en las propiedades de la solución y, a continuación, desactivar el administrador de carga de soluciones.

Control de eventos de carga de soluciones

Para suscribirse a eventos de carga de soluciones, llame AdviseSolutionEvents al activar el administrador de carga de soluciones. Si implementa IVsSolutionLoadEvents, puede responder a eventos relacionados con diferentes propiedades de carga de proyectos.

  • OnBeforeOpenSolution: este evento se desencadena antes de que se abra una solución.

  • OnBeforeBackgroundSolutionLoadBegins: este evento se desencadena después de cargar completamente la solución, pero antes de que la carga del proyecto en segundo plano comience de nuevo.

  • OnAfterBackgroundSolutionLoadComplete: este evento se desencadena después de que una solución se cargue por completo inicialmente, independientemente de si hay o no un administrador de carga de soluciones. También se desencadena después de la carga en segundo plano o la carga de demanda cada vez que la solución se carga completamente. Al mismo tiempo, SolutionExistsAndFullyLoaded_guid se reactiva.

  • OnQueryBackgroundLoadProjectBatch: este evento se desencadena antes de cargar un proyecto (o proyectos). Para asegurarse de que se completan otros procesos en segundo plano antes de cargar los proyectos, establezca en pfShouldDelayLoadToNextIdletrue.

  • OnBeforeLoadProjectBatch: este evento se desencadena cuando se va a cargar un lote de proyectos. Si fIsBackgroundIdleBatch es true, los proyectos se cargarán en segundo plano; si fIsBackgroundIdleBatch es false, los proyectos se cargarán sincrónicamente como resultado de una solicitud de usuario, por ejemplo, si el usuario expande un proyecto pendiente en Explorador de soluciones. Puede controlar este evento para realizar un trabajo costoso que, de lo contrario, tendría que realizarse en OnAfterOpenProject.

  • OnAfterLoadProjectBatch: este evento se desencadena después de cargar un lote de proyectos.

Detección y administración de la carga de soluciones y proyectos

Para detectar el estado de carga de proyectos y soluciones, llame a GetProperty con los siguientes valores:

  • __VSPROPID4. VSPROPID_IsSolutionFullyLoaded: var devuelve true si la solución y todos sus proyectos se cargan; de lo contrario false, .

  • __VSPROPID4. VSPROPID_IsInBackgroundIdleLoadProjectBatch: var devuelve true si se está cargando un lote de proyectos en segundo plano; de lo contrario false, .

  • __VSPROPID4. VSPROPID_IsInSyncDemandLoadProjectBatch: var devuelve true si un lote de proyectos se está cargando de forma sincrónica como resultado de un comando de usuario u otra carga explícita; de lo contrario false, .

  • __VSPROPID2. VSPROPID_IsSolutionClosing: var devuelve true si la solución se está cerrando actualmente; de lo contrario false, .

  • __VSPROPID. VSPROPID_IsSolutionOpening: var devuelve true si actualmente se abre una solución; de lo contrario false, .

También puede asegurarse de que los proyectos y soluciones se cargan llamando a uno de los métodos siguientes:

  • EnsureSolutionIsLoaded: al llamar a este método, los proyectos de una solución se cargan antes de que el método devuelva.

  • EnsureProjectIsLoaded: al llamar a este método, los proyectos de guidProject se cargan antes de que el método devuelva.

  • EnsureProjectsAreLoaded: al llamar a este método, se fuerza al proyecto a guidProjectID cargar antes de que el método devuelva.