如何异步加载初始解决方案时通知VSPackage

问题描述 投票:0回答:1

[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,这将允许我提取已经打开的解决方案/项目。

如何通知我最初的解决方案/项目?

c# visual-studio asynchronous vsix vspackage
1个回答
0
投票

简单的答案是,您不能,因为现在正在异步加载程序包,因此在您的程序包有机会沉入/建议那些事件接口之前,解决方案可能已经加载并触发了这些事件。您需要更改软件包中的逻辑以适应这种可能性。

© www.soinside.com 2019 - 2024. All rights reserved.