Administrar la carga de proyecto en una soluciónManaging Project Loading in a Solution

Soluciones de Visual Studio pueden contener un gran número de proyectos.Visual Studio solutions can contain a large number of projects. El comportamiento predeterminado de Visual Studio es cargar todos los proyectos en una solución en el momento en que se abre la solución y no permite al usuario tener acceso a cualquiera de los proyectos hasta que todas ellas han terminado de cargarse.The default Visual Studio behavior is to load all the projects in a solution at the time the solution is opened, and not to allow the user to access any of the projects until all of them have finished loading. Cuando el proceso de carga de proyecto durará 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.When the process of project loading will last more than two minutes, a progress bar is displayed showing the number of projects loaded and the total number of projects. El usuario puede descargar proyectos mientras trabaja en una solución con varios proyectos, pero este procedimiento tiene algunas desventajas: no se compilan los proyectos de descargados como parte de un comando de volver a generar solución, y las descripciones de IntelliSense de tipos y miembros de cerrado no se muestran los proyectos.The user can unload projects while working in a solution with multiple projects, but this procedure has some disadvantages: the unloaded projects are not built as part of a Rebuild Solution command, and IntelliSense descriptions of types and members of closed projects are not displayed.

Los desarrolladores pueden reducir los tiempos de carga de solución y administrar el comportamiento de carga mediante la creación de una carga de la solución el administrador del proyecto.Developers can reduce solution load times and manage project loading behavior by creating a solution load manager. El Administrador de carga de la solución puede asegurarse de que los proyectos se cargan antes de iniciar una compilación de fondo, retrasar la carga de fondo hasta que finalicen otras tareas en segundo plano y realizar otras tareas de administración de la carga de proyecto.The solution load manager can make sure that projects are loaded before starting a background build, delay background loading until other background tasks are complete, and perform other project load management tasks.

Creación de una carga de solución managerCreating a solution load manager

Los desarrolladores pueden crear una carga de solución manager implementando IVsSolutionLoadManager y avisa de Visual Studio que el Administrador de carga de la solución está activo.Developers can create a solution load manager by implementing IVsSolutionLoadManager and advising Visual Studio that the solution load manager is active.

Activación de un administrador de carga de la soluciónActivating a solution load manager

Visual Studio permite a solo un administrador de carga de solución en un momento dado, por lo que deberá notificar a Visual Studio cuando desea activar la carga de la solución manager.Visual Studio allows only one solution load manager at a given time, so you must advise Visual Studio when you want to activate your solution load manager. Si un administrador de carga de solución segundo se activa más adelante, se desconectará el Administrador de carga de la solución.If a second solution load manager is activated later on, your solution load manager will be disconnected.

Debe obtener el SVsSolution de servicio y establezca el __VSPROPID4 propiedad:You must get the SVsSolution service and set the __VSPROPID4 property:

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

El OnDisconnect método se llama cuando Visual Studio se está cerrando o cuando un paquete diferente ha asumido como el Administrador de carga de soluciones activas mediante una llamada a SetProperty con el __VSPROPID4 propiedad.The OnDisconnect method is called either when Visual Studio is being shut down or when a different package has taken over as the active solution load manager by calling SetProperty with the __VSPROPID4 property.

Estrategias para distintos tipos de administrador de carga de la soluciónStrategies for different kinds of solution load manager

Puede implementar administradores de carga de solución de maneras diferentes, dependiendo de los tipos de soluciones que están concebidos para administrar.You can implement solution load managers in different ways, depending on the types of solutions they are meant to manage.

Si el Administrador de carga de la solución se ha diseñado para administrar soluciones cargar por lo general, se puede implementar como parte de un paquete VSPackage.If the solution load manager is meant to manage solution loading in general, it can be implemented as part of a VSPackage. El paquete debe establecerse para cargar automáticamente agregando el ProvideAutoLoadAttribute en el VSPackage con un valor de SolutionOpening_guid.The package should be set to autoload by adding the ProvideAutoLoadAttribute on the VSPackage with a value of SolutionOpening_guid. A continuación, se puede activar el Administrador de carga de la solución en el Initialize método.The solution load manager can then be activated in the Initialize method.

Nota

Para obtener más información acerca de los paquetes de carga automática, consulte cargar VSPackages.For more information about autoloading packages, see Loading VSPackages.

Dado que Visual Studio reconoce solo la última solución carga manager que se debe activar, administradores de la carga de la solución general siempre deberían detectar si hay un administrador de carga existente antes de activar por sí mismos.Since Visual Studio recognizes only the last solution load manager to be activated, general solution load managers should always detect whether there is an existing load manager before activating themselves. Si una llamada a GetProperty() en el servicio de la solución para __VSPROPID4 devuelve null, no hay ningún administrador de carga de la solución activa.If calling GetProperty() on the solution service for __VSPROPID4 returns null, there is no active solution load manager. Si no devuelve null, compruebe si el objeto es el mismo que el Administrador de carga de la solución.If it does not return null, check whether the object is the same as your solution load manager.

Si el Administrador de carga de la solución se ha diseñado para administrar solo unos tipos de soluciones, el VSPackage puede suscribirse a eventos de carga de solución (mediante una llamada a AdviseSolutionEvents) y usar el controlador de eventos OnBeforeOpenSolution para activar el Administrador de carga de la solución.If the solution load manager is meant to manage only a few types of solution, the VSPackage can subscribe to solution load events (by calling AdviseSolutionEvents), and use the event handler for OnBeforeOpenSolution to activate the solution load manager.

Si el Administrador de carga de la solución se ha 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 de solución anterior.If the solution load manager is meant to manage only specific solutions, the activation information can be persisted as part of the solution file by calling WriteSolutionProps for the pre-solution section.

Administradores de carga de solución específica que deberían desactivarse por sí mismos en el OnAfterCloseSolution controlador de eventos, en orden no entra en conflicto con otros administradores de carga de la solución.Specific solution load managers should deactivate themselves in the OnAfterCloseSolution event handler, in order not to conflict with other solution load managers.

Si necesita un administrador de carga de la solución solo para conservar propiedades de carga global del proyecto (por ejemplo, se establecen en una página de opciones), puede activar el Administrador de carga de la solución en el OnAfterOpenProject controlador de eventos, la configuración en las propiedades de la solución, a continuación, se conservan desactivar el Administrador de carga de la solución.If you need a solution load manager only to persist global project load properties (for example, properties set on an Options page), you can activate the solution load manager in the OnAfterOpenProject event handler, persist the setting in the solution properties, then deactivate the solution load manager.

Control de eventos de carga de soluciónHandling solution load events

Para suscribirse a eventos de carga de la solución, llame a AdviseSolutionEvents cuando activa el Administrador de carga de la solución.To subscribe to solution load events, call AdviseSolutionEvents when you activate your solution load manager. Si implementa IVsSolutionLoadEvents, puede responder a eventos que se relacionan a cargar las propiedades de proyecto diferente.If you implement IVsSolutionLoadEvents, you can respond to events that relate to different project loading properties.

  • OnBeforeOpenSolution: Este evento se desencadena antes de abre una solución.OnBeforeOpenSolution: This event is fired before a solution is opened.

  • OnBeforeBackgroundSolutionLoadBegins: Este evento se desencadena después de que la solución está completamente cargada pero antes de fondo proyecto cargar comienza de nuevo.OnBeforeBackgroundSolutionLoadBegins: This event is fired after the solution is completely loaded, but before background project loading begins again.

  • OnAfterBackgroundSolutionLoadComplete: Este evento se desencadena después de carga totalmente inicialmente una solución, si no hay un administrador de carga de la solución.OnAfterBackgroundSolutionLoadComplete: This event is fired after a solution is initially fully loaded, whether or not there is a solution load manager. También se desencadena después de carga en segundo plano o petición carga cada vez que la solución pasa a ser totalmente cargada.It is also fired after background load or demand load whenever the solution becomes fully loaded. Al mismo tiempo, SolutionExistsAndFullyLoaded_guid se reactiva.At the same time, SolutionExistsAndFullyLoaded_guid is reactivated.

  • OnQueryBackgroundLoadProjectBatch: Este evento se desencadena antes de la carga de un proyecto (o proyectos).OnQueryBackgroundLoadProjectBatch: This event is fired before the loading of a project (or projects). Para asegurarse de que otros procesos en segundo plano se completan antes de que los proyectos se carguen, establezca pfShouldDelayLoadToNextIdle a true.To ensure that other background processes are completed before the projects are loaded, set pfShouldDelayLoadToNextIdle to true.

  • OnBeforeLoadProjectBatch: Este evento se desencadena cuando un lote de proyectos se va a cargarse.OnBeforeLoadProjectBatch: This event is fired when a batch of projects is about to be loaded. Si fIsBackgroundIdleBatch es true, los proyectos son que se carguen en segundo plano; si fIsBackgroundIdleBatch es false, los proyectos que van a ser cargado de forma sincrónica como resultado de una solicitud de usuario, por ejemplo, si el usuario expande un proyecto pendiente en el Explorador de soluciones.If fIsBackgroundIdleBatch is true, the projects are to be loaded in the background; if fIsBackgroundIdleBatch is false, the projects are to be loaded synchronously as a result of a user request, for example if the user expands a pending project in Solution Explorer. Puede controlar este evento para realizar trabajo costoso que en caso contrario, tendría que hacer en OnAfterOpenProject.You can handle this event to do expensive work that otherwise would need to be done in OnAfterOpenProject.

  • OnAfterLoadProjectBatch: Este evento se desencadena después de que se ha cargado un lote de proyectos.OnAfterLoadProjectBatch: This event is fired after a batch of projects has been loaded.

Detectar y administrar soluciones y carga del proyectoDetecting and managing solution and project loading

Con el fin de detectar el estado de carga de los proyectos y soluciones, llame a GetProperty con los valores siguientes:In order to detect the load state of projects and solutions, call GetProperty with the following values:

  • __VSPROPID4: var devuelve true si la solución y todos sus proyectos se cargan, de lo contrario false.__VSPROPID4: var returns true if the solution and all its projects are loaded, otherwise false.

  • __VSPROPID4: var devuelve true si un lote de proyectos que se va a cargada en segundo plano, de lo contrario false.__VSPROPID4: var returns true if a batch of projects is currently being loaded in the background, otherwise false.

  • __VSPROPID4: var devuelve true si un lote de proyectos es actualmente está cargado de forma sincrónica como resultado de un comando de usuario u otra carga explícita, de lo contrario false.__VSPROPID4: var returns true if a batch of projects is currently being loaded synchronously as a result of a user command or other explicit load, otherwise false.

  • __VSPROPID2: var devuelve true si la solución actualmente se cierra, en caso contrario, false.__VSPROPID2: var returns true if the solution is currently being closed, otherwise false.

  • __VSPROPID: var devuelve true si una solución actualmente se abre, en caso contrario, false.__VSPROPID: var returns true if a solution is currently being opened, otherwise false.

    También puede asegurarse de que los proyectos y soluciones se cargan llamando a uno de los métodos siguientes:You can also ensure that projects and solutions are loaded by calling one of the following methods:

  • EnsureSolutionIsLoaded: llamar a este método obliga a los proyectos de una solución para cargar antes de que el método devuelve.EnsureSolutionIsLoaded: calling this method forces the projects in a solution to load before the method returns.

  • EnsureProjectIsLoaded: llamar a este método obliga a los proyectos de guidProject cargar antes de que el método devuelve.EnsureProjectIsLoaded: calling this method forces the projects in guidProject to load before the method returns.

  • EnsureProjectsAreLoaded: llamar a este método fuerza el proyecto en guidProjectID cargar antes de que el método devuelve.EnsureProjectsAreLoaded: calling this method forces the project in guidProjectID to load before the method returns.