CodeRefactoringProvider使Visual Studio在获得DTE服务后不从“收集建议”中回来

时间:2018-12-22 22:08:47

标签: c# visual-studio-2017 vsix

我想通过Visual Studio 2017 VSIX项目中的自定义CodeRefactoringProvider枚举当前项目的文件。为此,我使用DTE获取了Package.GetGlobalService服务,并遍历了解决方案。这段代码如下:

[ExportCodeRefactoringProvider( LanguageNames.CSharp, Name = nameof( MyCodeRefactoringProvider ) )]
[Shared]
internal class MyCodeRefactoringProvider : CodeRefactoringProvider {
    public sealed override async Task ComputeRefactoringsAsync( CodeRefactoringContext context ) {
        await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync( cancellationToken );
        DTE dte = (DTE)Package.GetGlobalService( typeof( DTE ) );
        //Enumerate project items...
        return new CodeAction[ 0 ];
    }
}

我使用JoinableTaskFactory.SwitchToMainThreadAsync从主线程访问DTE服务,以避免相关警告。我可以枚举文件并保留ComputeRefactoringsAsync方法。然后,当我尝试打开重构弹出菜单时,出现一条消息“收集建议”,该消息一直显示,直到按 Cancel

为止。

Gathering Suggestions

如果我实际上使用DTE界面或添加一些实际的CodeAction对象,则实际上完全不相关。仅仅获得服务就足够了。

我尝试了以下方法来解决此问题,但没有任何运气:

  1. 我已删除对SwitchToMainThreadAsync的呼叫(并忽略了警告)。该消息仍然显示。
  2. 我尝试通过MEF导入DTE接口,但该接口不起作用(如this Q&A中所述)
  3. 我尝试枚举以JoinableTaskFactory.RunAsync开始的另一个线程中的项目文件。然后在任务上调用JoinAsync。问题仍然存在。
  4. 我尝试使用await TaskScheduler.Default返回到原始线程。再没有运气了。

在这种情况下,无法通过CodeRefactoringContext枚举文件,因为它仅包含C#文件,我也需要访问其他文件类型。我特别需要访问resx文件。通过上下文,我可以访问从resx生成的源文件,而不是文件本身。

是否可以使用DTE而不会发生此问题?还是有其他方法可以从CodeRefactoringProvider访问项目项?

0 个答案:

没有答案