【问题标题】:How would I programmatically tell Visual Studio to load external modifications?我将如何以编程方式告诉 Visual Studio 加载外部修改?
【发布时间】:2020-03-23 10:20:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 嗨朋友,这个问题有什么更新吗?
  • @LanceLi-MSFT:我在 Roslyn gitter 聊天中被告知这几乎是不可能的,最好的办法是使用延迟。

标签: c# visual-studio roslyn visual-studio-extensions vsix


【解决方案1】:

在最新版本的 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();

【讨论】:

  • 感谢@Jonathon 的回答。我要试试看。注意:IVsOperationProgressStatusService 从 Microsoft.VisualStudio.Shell.Framework 16.1.28917.181 开始提供
  • 文档说IVsOperationProgressStageStatus.WaitForCompletionAsync “等待当前正在进行的工作完成。” 我需要找到一种方法来知道 Visual Studio 实际上已经注意到磁盘上的更改并在我等待之前开始处理它。我还需要知道智能感知状态是否一直处于忙碌状态,而在更改项目等之间没有“完成”的时刻。
  • 不幸的是,await intellisenseStatus.WaitForCompletionAsync(); 在工作区更改之前完成。
  • 您可以查询某个阶段是否已排队。如果您已完成结帐并且它说没有“智能感知”阶段已排队,则您知道工作尚未处理。
  • 谢谢@Jonathon。我已经在 Visual Studio 2019 (16.4.1) 中对其进行了测试,不幸的是,智能感知状态仅在我加载新解决方案时才会改变,而不是在外部修改文件时。我已经连接了一个回调到IVsOperationProgressStageStatus.InProgressChanged,我尝试等待WaitForCompletionAsync,但即使进行了外部更改,它也总是返回相同的数字。
猜你喜欢
  • 2023-04-10
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多