Как уведомить VSPackage об асинхронной загрузке исходного решения - PullRequest
0 голосов
/ 20 апреля 2020

Этот вопрос касается моего вопроса, но не изменений, внесенных в Visual Studio 2019, где VSIX проекты загружаются асинхронно, тогда как в предыдущих версиях Visual Studio VSIX проекты загружались синхронно.

Я использую IVsSolutionEvents3 в своих проектах VSIX, чтобы получать уведомления о

VSTestPackage1: OnAfterOpenProject
VSTestPackage1: OnQueryCloseSolution
VSTestPackage1: OnQueryCloseProject
VSTestPackage1: OnQueryCloseProject
VSTestPackage1: OnBeforeCloseSolution
VSTestPackage1: OnQueryCloseProject
VSTestPackage1: OnBeforeCloseProject
VSTestPackage1: OnQueryCloseProject
VSTestPackage1: OnBeforeCloseProject
VSTestPackage1: OnAfterCloseSolution

Я изменил оформление для своего проекта VSIX, чтобы включить рекомендованный SolutionExistsAndFullyLoaded, однако я не получаю никаких уведомлений для самое первое решение, которое открывает пользователь. В VS2019 это новое диалоговое окно, отображаемое до фактической среды IDE.

[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string, PackageAutoLoadFlags.BackgroundLoad)]
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
[Guid(VSTestPackage1.PackageGuidString)]
[InstalledProductRegistration("#110", "#112", "2017.1.4.664", IconResourceID = 400)]
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")]
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class VSTestPackage1 :
    AsyncPackage,
    IVsSolutionEvents3,
    IVsUpdateSolutionEvents,
    IVsBuildStatusCallback,
    IDisposable
{
}

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

protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
     System.Diagnostics.Debug.WriteLine("VSTestPackage1: Entering Initialize()");
     ...
}

Вызов InitializeAsync() не предоставляет IVsHierarchy pHierarchy, что позволило бы мне извлечь уже открытое решение /project.

Как я могу получить уведомление о первоначальном решении / проекте?

1 Ответ

0 голосов
/ 20 апреля 2020

Простым ответом является то, что вы не можете этого сделать, поскольку ваш пакет теперь загружается асинхронно, поэтому решение, возможно, уже было загружено и запустило эти события до того, как ваш пакет получит возможность получить / сообщить об этих интерфейсах событий. Вам нужно будет изменить логи c в вашем пакете, чтобы учесть эту возможность.

По сути, вам нужно посмотреть, загружено ли уже интересующее вас решение или проект, и обработать его соответствующим образом.

Mad опубликовал блог, описывающий влияние перехода на asyn c Загрузка пакета описана ниже в одной из его предыдущих публикаций в блоге:

Улучшение отзывчивости критического сценария ios путем обновления поведения автозагрузки для расширений

В частности, раздел «Влияние на реализацию пакетов».

С уважением,

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