Поделиться через


Управление загрузкой проекта в решении

Решения Visual Studio могут содержать большое количество проектов. Поведение Visual Studio по умолчанию — загружать все проекты в решении во время открытия решения, а не разрешать пользователю получать доступ к любому из проектов до тех пор, пока все из них не завершят загрузку. Когда процесс загрузки проекта будет длиться более двух минут, отображается индикатор хода выполнения, показывающий количество загруженных проектов и общее количество проектов. Пользователь может выгрузить проекты во время работы в решении с несколькими проектами, но эта процедура имеет некоторые недостатки: выгрузочные проекты не создаются в рамках команды перестроения решений, а описания типов и членов закрытых проектов не отображаются.

Разработчики могут сократить время загрузки решения и управлять поведением загрузки проекта, создав диспетчер нагрузки решения. Диспетчер загрузки решений может убедиться, что проекты загружаются перед запуском фоновой сборки, задержкой фоновой загрузки до завершения других фоновых задач и выполнения других задач управления нагрузкой проекта.

Создание диспетчера нагрузки решения

Разработчики могут создать диспетчер нагрузки решения, реализуя IVsSolutionLoadManager и советуя Visual Studio, что диспетчер нагрузки решения активен.

Активация диспетчера загрузки решения

Visual Studio разрешает только один диспетчер нагрузки решения в определенное время, поэтому вам необходимо посоветовать Visual Studio при активации диспетчера нагрузки решения. Если второй диспетчер загрузки решения активируется позже, диспетчер загрузки решения будет отключен.

Необходимо получить SVsSolution службу и задать __VSPROPID4. свойство VSPROPID_ActiveSolutionLoadManager:

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

Метод OnDisconnect вызывается либо при завершении работы Visual Studio, либо при выполнении другого пакета в качестве активного диспетчера нагрузки решения путем вызова SetProperty __VSPROPID4 . свойство VSPROPID_ActiveSolutionLoadManager.

Стратегии для диспетчера загрузки решений различных типов

Диспетчеры нагрузки решений можно реализовать различными способами в зависимости от типов решений, которые они предназначены для управления.

Если диспетчер нагрузки решения предназначен для управления загрузкой решений в целом, его можно реализовать как часть VSPackage. Пакет должен быть установлен для автоматической загрузки, добавив ProvideAutoLoadAttribute его в VSPackage со значением SolutionOpening_guid. Затем диспетчер нагрузки решения можно активировать в методе Initialize .

Примечание.

Дополнительные сведения о автоматической загрузке пакетов см. в разделе "Загрузка VSPackages".

Так как Visual Studio распознает только последний диспетчер нагрузки решения, который необходимо активировать, диспетчеры нагрузки общего решения всегда должны определять наличие существующего диспетчера нагрузки перед активацией. При вызове GetProperty() службы решения для __VSPROPID4. VSPROPID_ActiveSolutionLoadManager возвращается null, нет активного диспетчера нагрузки решения. Если он не возвращает значение NULL, проверка, совпадает ли объект с диспетчером загрузки решения.

Если диспетчер нагрузки решения предназначен для управления только несколькими типами решения, VSPackage может подписаться на события загрузки решения (вызывая AdviseSolutionEvents) и использовать обработчик событий для OnBeforeOpenSolution активации диспетчера нагрузки решения.

Если диспетчер загрузки решения предназначен для управления только определенными решениями, сведения о активации можно сохранить в рамках файла решения, вызвав WriteSolutionProps раздел предварительного решения.

Конкретные диспетчеры загрузки решений должны деактивировать себя в обработчике OnAfterCloseSolution событий, чтобы не конфликтовать с другими диспетчерами загрузки решений.

Если вам нужен диспетчер нагрузки решения только для сохранения свойств глобальной загрузки проекта (например, свойств, заданных на странице "Параметры"), можно активировать диспетчер загрузки решения в обработчике событий, сохранить параметр в OnAfterOpenProject свойствах решения, а затем отключить диспетчер загрузки решения.

Обработка событий загрузки решения

Чтобы подписаться на события загрузки решения, вызовите AdviseSolutionEvents при активации диспетчера загрузки решения. При реализации IVsSolutionLoadEventsможно реагировать на события, связанные с различными свойствами загрузки проекта.

  • OnBeforeOpenSolution: это событие запускается перед открытием решения.

  • OnBeforeBackgroundSolutionLoadBegins: это событие запускается после полной загрузки решения, но до начала фоновой загрузки проекта.

  • OnAfterBackgroundSolutionLoadComplete: это событие запускается после первоначальной загрузки решения, независимо от того, существует ли диспетчер загрузки решения. Он также запускается после фоновой загрузки или загрузки спроса, когда решение будет полностью загружено. В то же время SolutionExistsAndFullyLoaded_guid активируется повторно.

  • OnQueryBackgroundLoadProjectBatch: это событие запускается перед загрузкой проекта (или проектов). Чтобы убедиться, что другие фоновые процессы завершены до загрузки проектов, задайте pfShouldDelayLoadToNextIdle значение true.

  • OnBeforeLoadProjectBatch: это событие запускается при загрузке пакета проектов. Если fIsBackgroundIdleBatch задано значение true, проекты загружаются в фоновом режиме; если fIsBackgroundIdleBatch значение false, проекты должны загружаться синхронно в результате запроса пользователя, например если пользователь расширяет ожидающий проект в Обозреватель решений. Это событие можно обрабатывать для выполнения дорогостоящих работ, которые в противном случае потребуется выполнить.OnAfterOpenProject

  • OnAfterLoadProjectBatch: это событие запускается после загрузки пакета проектов.

Обнаружение и управление загрузкой решений и проектов

Чтобы определить состояние нагрузки проектов и решений, вызовите GetProperty следующие значения:

  • __VSPROPID4. VSPROPID_IsSolutionFullyLoaded: var возвращает значение true , если решение и все его проекты загружены, в противном случае false.

  • __VSPROPID4. VSPROPID_IsInBackgroundIdleLoadProjectBatch: var возвращается true , если пакет проектов в настоящее время загружается в фоновом режиме, в противном случае false.

  • __VSPROPID4. VSPROPID_IsInSyncDemandLoadProjectBatch: var возвращается true , если пакет проектов в настоящее время загружается синхронно в результате пользовательской команды или другой явной загрузки, в противном случае false.

  • __VSPROPID2. VSPROPID_IsSolutionClosing: var возвращает, true если решение в настоящее время закрыто, в противном случае false.

  • __VSPROPID. VSPROPID_IsSolutionOpening: var возвращает, true если в настоящее время открыто решение, в противном случае false.

Вы также можете убедиться, что проекты и решения загружаются, вызвав один из следующих методов:

  • EnsureSolutionIsLoaded: вызов этого метода заставляет проекты в решении загружаться до возврата метода.

  • EnsureProjectIsLoaded: вызов этого метода заставляет проекты guidProject загружаться до возврата метода.

  • EnsureProjectsAreLoaded: вызов этого метода заставляет проект guidProjectID загружаться до возврата метода.