首页 > 解决方案 > 我将如何以编程方式告诉 Visual Studio 加载外部修改?

问题描述

我正在编写一个执行以下操作的 Visual Studio 2019 扩展:

CheckoutGitBranch("some-branch");
WaitUntilChangesAreLoadedIntoWorkspace(); // <-- How to implement?
AnalyzeCodeInWorkspace();

如何等到 Visual Studio 将更改加载到工作区?

我一直在考虑监听VisualStudioWorkspace.WorkspaceChanged事件,但目前还不清楚所有更改何时都已集成到工作区中。

标签: c#visual-studioroslynvisual-studio-extensionsvsix

解决方案


在最新版本的 VS(撰写本文时为 16.5)中有一个新的 API,您可以通过 MEF 导入称为IVsOperationProgressStatusService,然后您可以询问当前操作的状态。虽然Intellisense阶段并不明显表示完整的工作区更新(项目系统已处理所有文件更新并将它们发送到工作区)。

CheckoutGitBranch("some-branch");
// Don't know how your extension is acquiring VS services, you can do this however you want.
// Including using MEF, grabbing it during package initialization etc. 
// Whichever method grabs this service does need to be on the UI thread though.
var operationProgress= await _serviceProvider.GetServiceAsync<SVsOperationProgress, IVsOperationProgressStatusService>(throwOnFailure: true);
IVsOperationProgressStageStatus intellisenseStatus = operationProgress.GetStageStatus(CommonOperationProgressStageIds.Intellisense);
await intellisenseStatus.WaitForCompletionAsync();
AnalyzeCodeInWorkspace();

推荐阅读