Administrar la carga del proyecto en una soluciónManage 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 de Visual Studio predeterminado es cargar todos los proyectos de una solución en el momento en que se abra la solución y no permite al usuario tener acceso a cualquiera de los proyectos hasta que todos ellos 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 los 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 descargados como parte de un comando recompilar 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 solución 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 solución puede asegurarse de que los proyectos se cargan antes de iniciar una compilación en segundo plano, retraso al cargar en segundo plano hasta que se completen otras tareas en segundo plano y realizar otras tareas de administración de 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.

Crear una carga de solución de administradorCreate a solution load manager

Los desarrolladores pueden crear una carga de solución manager implementando IVsSolutionLoadManager y Visual Studio que avisa de que el Administrador de carga de 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.

Activar un administrador de carga de soluciónActivate a solution load manager

Visual Studio permite a solo un administrador de carga de solución en un momento dado, por lo que debe dar a conocer a Visual Studio cuando desea activar la carga de 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 segundo administrador de carga de solución está activado más adelante, se desconectará el Administrador de carga de 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 llama al método cuando se cierra Visual Studio o cuando un paquete diferente ha asumido 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 soluciónStrategies for different kinds of solution load manager

Puede implementar administradores de la carga de solución de maneras diferentes, dependiendo de los tipos de soluciones que están diseñadas 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 solución se ha diseñado para administrar la carga en general de la solución, 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 se debe establecer en autoload 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 solución en el Initialize método.The solution load manager can then be activated in the Initialize method.

Note

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 Administrador de carga para activarse, administradores de la carga de solución general siempre deben detectar si hay un administrador de carga existente antes de activar a 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 solución activa.If calling GetProperty() on the solution service for __VSPROPID4 returns null, there is no active solution load manager. Si no se devuelve null, compruebe si el objeto es igual que el Administrador de carga de 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 solución se ha diseñado para administrar solo unos pocos 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 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 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 previa de la solución.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 la carga de solución específica que se deberían desactivar a sí mismos en el OnAfterCloseSolution controlador de eventos, para que no entran en conflicto con otros administradores de la carga de 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 solución solo para conservar las propiedades de carga global de proyectos (por ejemplo, propiedades establecidas en una página de opciones), puede activar el Administrador de carga de solución en el OnAfterOpenProject controlador de eventos, conservar la configuración, a continuación, en las propiedades de la solución, desactivar el Administrador de carga de 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.

Controlar eventos de carga de soluciónHandle solution load events

Para suscribirse a eventos de carga de solución, llame a AdviseSolutionEvents al activar el Administrador de carga de solución.To subscribe to solution load events, call AdviseSolutionEvents when you activate your solution load manager. Si implementa IVsSolutionLoadEvents, puede responder a eventos relacionados con 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 que se abre una solución.OnBeforeOpenSolution: This event is fired before a solution is opened.

  • OnBeforeBackgroundSolutionLoadBegins: Este evento se desencadena después de la solución se haya cargado, pero antes en segundo plano carga del proyecto 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 inicialmente completamente una solución, si hay un administrador de carga de 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 la demanda de carga siempre que se carguen por completo la solución.It is also fired after background load or demand load whenever the solution becomes fully loaded. Al mismo tiempo, SolutionExistsAndFullyLoaded_guid se vuelve a activar.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 se cargan los proyectos, 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 está a punto de cargarse.OnBeforeLoadProjectBatch: This event is fired when a batch of projects is about to be loaded. Si fIsBackgroundIdleBatch es true, los proyectos son deben cargarse en segundo plano; si fIsBackgroundIdleBatch es false, los proyectos que van a cargarse sincrónicamente 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 de lo contrario tendría que realizarse 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 la carga de proyectosDetect and manage solution and project loading

Para detectar el estado de carga de 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 está cargado 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 se está cargando actualmente sincrónicamente como resultado de un comando de usuario o de otros de la 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 está actualmente está cerrada, de lo contrario false.__VSPROPID2: var returns true if the solution is currently being closed, otherwise false.

  • __VSPROPID: var devuelve true si una solución está abierta actualmente, 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.