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. Puede establecer otro proyecto cargar las prioridades para los proyectos específicos o tipos de proyecto, asegúrese 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 el Administrador de carga de la solución otras tareas de administración de carga de proyecto.The solution load manager can set different project loading priorities for specific projects or project types, 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.

Cargar las prioridades del proyectoProject loading priorities

Visual Studio define cuatro prioridades de carga de proyecto diferente:Visual Studio defines four different project loading priorities:

  • _VSProjectLoadPriority(el valor predeterminado): cuando se abre una solución, los proyectos se cargan de forma asincrónica._VSProjectLoadPriority (the default): when a solution is opened, projects are loaded asynchronously. Si esta prioridad se establece en un proyecto sin cargar después de que la solución ya está abierta, el proyecto se cargará en el siguiente punto inactivo.If this priority is set on an unloaded project after the solution is already open, the project will be loaded at the next idle point.

  • _VSProjectLoadPriority: cuando se abre una solución, los proyectos se cargan en segundo plano, lo que permite al usuario acceder a los proyectos que se cargan sin tener que esperar hasta que se cargan todos los proyectos._VSProjectLoadPriority: when a solution is opened, projects are loaded in the background, allowing the user to access the projects as they are loaded without having to wait until all the projects are loaded.

  • _VSProjectLoadPriority: los proyectos se cargan cuando se accede a estos._VSProjectLoadPriority: projects are loaded when they are accessed. Se tiene acceso a un proyecto cuando el usuario expande el nodo del proyecto en el Explorador de soluciones, cuando se abre un archivo que pertenecen al proyecto cuando se abre la solución porque está en la lista de documentos abiertos (guardada en el archivo de opciones de usuario de la solución), o cuando otro proyecto es decir que se está cargando tiene una dependencia en el proyecto.A project is accessed when the user expands the project node in the Solution Explorer, when a file belonging to the project is opened when the solution opens because it is in the open document list (persisted in the solution's user options file), or when another project that is being loaded has a dependency on the project. Este tipo de proyecto no se carga automáticamente antes de iniciar un proceso de compilación; el Administrador de carga de la solución es responsable de garantizar que todos los proyectos necesarios están cargados.This type of project is not automatically loaded before starting a build process; the Solution Load Manager is responsible for ensuring that all the necessary projects are loaded. Estos proyectos también se deben cargar antes de iniciar una Buscar/Reemplazar en archivos en toda la solución.These projects should also be loaded before starting a Find/Replace in Files across the entire solution.

  • _VSProjectLoadPriority: los proyectos no son va a cargar, a menos que el usuario lo solicita explícitamente._VSProjectLoadPriority: projects are not to be loaded unless the user explicitly requests it. Esto sucede cuando los proyectos se descargan explícitamente.This is the case when projects are explicitly unloaded.

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);  

Implementar IVsSolutionLoadManagerImplementing IVsSolutionLoadManager

El OnBeforeOpenProject método se llama durante el proceso de abrir la solución.The OnBeforeOpenProject method is called during the process of opening the solution. Para implementar este método, debe utilizar el IVsSolutionLoadManagerSupport servicio para establecer la prioridad de carga para el tipo de proyecto que se va a administrar.To implement this method, you use the IVsSolutionLoadManagerSupport service to set the load priority for the type of project you wish to manage. Por ejemplo, el código siguiente establece tipos de proyecto de C# para cargar en segundo plano:For example, the following code sets C# project types to load in the background:

Guid guidCSProjectType = new Guid("{FAE04EC0-301F-11d3-BF4B-00C04F79EFBC}");  
pSLMgrSupport.SetProjectLoadPriority(guidProjectID, (uint)_VSProjectLoadPriority.PLP_BackgroundLoad);  

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, se puede conservar la información de activación como parte del archivo de 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. Para ello, llame a WriteSolutionProps para la sección de solución anterior.To do this, call 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 las prioridades del proyecto global carga (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 priorities (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, se puede responder a eventos relacionados con proyectos diferentes prioridades de carga.If you implement IVsSolutionLoadEvents, you can respond to events that relate to different project loading priorities.

  • OnBeforeOpenSolution: Se desencadena antes de abre una solución.OnBeforeOpenSolution: This is fired before a solution is opened. Puede usarlo para cambiar el proyecto cargar prioridad para los proyectos de la solución.You can use it to change the project loading priority for the projects in the solution.

  • OnBeforeBackgroundSolutionLoadBegins: Esto se activa después de la solución está completamente cargada, pero antes de fondo proyecto cargar comienza de nuevo.OnBeforeBackgroundSolutionLoadBegins: This is fired after the solution is completely loaded, but before background project loading begins again. Por ejemplo, un usuario podría haber accedido a un proyecto cuya prioridad de carga es LoadIfNeeded o el Administrador de carga de la solución puede haber cambiado una prioridad de carga del proyecto a BackgroundLoad, que empezarán a una carga en segundo plano de ese proyecto.For example, a user might have accessed a project whose load priority is LoadIfNeeded, or the solution load manager might have changed a project load priority to BackgroundLoad, which would start a background load of that project.

  • OnAfterBackgroundSolutionLoadComplete: Si no hay un administrador de carga de la solución Esto se activa después de una solución está inicialmente totalmente cargada.OnAfterBackgroundSolutionLoadComplete: This 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: Esto se activa antes de la carga de un proyecto (o proyectos).OnQueryBackgroundLoadProjectBatch: This 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: Se activa cuando un lote de proyectos se va a cargarse.OnBeforeLoadProjectBatch: This 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 hacerlo para realizar trabajo costoso que en caso contrario, tendría que hacer en OnAfterOpenProject.You can implement this to do expensive work that otherwise would need to be done in OnAfterOpenProject.

  • OnAfterLoadProjectBatch: Esto se activa después de que se ha cargado un lote de proyectos.OnAfterLoadProjectBatch: This 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 cargadas actualmente en segundo plano, de lo contrario false.__VSPROPID4: var returns true if a batch of projects are currently being loaded in the background, otherwise false.

  • __VSPROPID4: var devuelve true si un lote de proyectos están actualmente está cargado de forma sincrónica como resultado de un comando de usuario u otra carga explícita, en caso contrario, false.__VSPROPID4: var returns true if a batch of projects are 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 se cargan los proyectos y soluciones (sin importar cuáles sean las prioridades de carga del proyecto) llamando a uno de los métodos siguientes:You can also ensure that projects and solutions are loaded (no matter what the project load priorities are) 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.

Nota

.. De forma predeterminada sólo los proyectos que tienen la demanda de carga y se cargan las prioridades de carga de segundo plano, pero si el __VSBSLFLAGS marca se pasa al método, se cargarán todos los proyectos excepto los que están marcados para cargar explícitamente.By default only the projects that have the demand load and background load priorities are loaded, but if the __VSBSLFLAGS flag is passed in to the method, all projects will be loaded except for the ones that are marked to load explicitly.