VS2019的DynamicMenu扩展太晚加载菜单

问题描述

我有一个使用动态菜单的VS扩展。因此,它使用vsct在“解决方案”和“项目”上定义一些菜单项,然后动态加载子项。此扩展程序在VS2017和许多旧版本中均能正常工作。

现在我正在对其进行更新以在VS2019中工作。我已经调整了目标版本,但遇到了VS2019不允许您同步加载程序包的问题,​​因此我将扩展类更改为使用AsyncPackage和InitializeAsync。即使进行了这些更改,当我为VS2017构建并运行该项目时,一切似乎都可以正常工作。

但是在VS2019中,Dynamicmenu加载为时已晚。如果我运行Visual Studio 2019并打开一个解决方案,然后在解决方案资源管理器中的解决方案或项目上单击鼠标右键,则vsct中定义的菜单项就位于此处,但尚未加载DynamicmenuPackage,因此子菜单的尚未填充,我最终看到了占位符子菜单

如果我仅等待30-60秒,它最终就会加载。我可以从字面上看到我的DynamicmenuPackage:AsyncPackage的静态构造函数最终被击中。但这不好。我需要确保在用户打开菜单时填充该菜单

在异步加载时该怎么办? 我尝试了可以​​找到的ProvideProLoad的每个选项,包括

VSConstants.UICONTEXT.DesignMode_string
VSConstants.UICONTEXT.solutionExists_string
VSConstants.UICONTEXT.solutionExistsAndFullyLoaded_string

但是这些都不产生可靠的结果。

是否可以使用AsyncPackage并以某种方式强制其同步加载?当然,如果不启用Visual Studio的“不推荐”选项来同步加载扩展程序。

任何想法都将受到欢迎。

解决方法

不可能同步加载AsyncPackage。我们所能做的就是设置

[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string,PackageAutoLoadFlags.BackgroundLoad)]
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string,PackageAutoLoadFlags.BackgroundLoad)]

然后等待。