[This question处理我的问题,只是不处理Visual Studio 2019
中所做的更改,其中VSIX
项目是异步加载的,在Visual Studio VSIX的早期版本中是同步加载的。
我在VSIX项目中使用IVsSolutionEvents3
来获得有关的通知
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
,这将允许我提取已经打开的解决方案/项目。
如何通知我最初的解决方案/项目?
简单的答案是,您不能,因为现在正在异步加载程序包,因此在您的程序包有机会沉入/建议那些事件接口之前,解决方案可能已经加载并触发了这些事件。您需要更改软件包中的逻辑以适应这种可能性。