C# CodeRefactoringProvider使Visual Studio从;收集建议”;获得DTE服务后

C# CodeRefactoringProvider使Visual Studio从;收集建议”;获得DTE服务后,c#,visual-studio-2017,vsix,C#,Visual Studio 2017,Vsix,我想从Visual Studio 2017 VSIX项目中的自定义CodeRefactoringProvider枚举当前项目的文件。为此,我使用Package.GetGlobalService获取DTE服务并迭代解决方案。此代码如下所示: [ExportCodeRefactoringProvider( LanguageNames.CSharp, Name = nameof( MyCodeRefactoringProvider ) )] [Shared] internal class MyCode

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

[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.switch到InthreadAsync
从主线程访问
DTE
服务,以避免出现相关警告。我可以枚举文件并保留
computerefactoringasync
方法。然后,当我尝试打开重构弹出菜单时,我会收到一条消息“收集建议”,它会一直显示,直到我按下取消:

如果我实际使用
DTE
接口或添加一些实际的
CodeAction
对象,那么这实际上是完全不相关的。仅仅获得服务就足够了

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

  • 我已删除对
    SwitchToMainThreadAsync
    的调用(并忽略了警告)。消息仍然显示
  • 我试图通过MEF导入
    DTE
    接口,但该接口不起作用(如中所述)
  • 我尝试在另一个线程中枚举项目文件,该线程是我从
    JoinableTaskFactory.RunAsync
    开始的。然后对任务调用
    JoinAsync
    。这个问题仍然存在
  • 我已尝试使用
    wait TaskScheduler.Default
    返回到原始线程。又没运气了
  • 在这种情况下,通过
    CodeRefactoringContext
    枚举文件不起作用,因为它只包含C#文件,我还需要访问其他文件类型。我特别需要访问
    resx
    文件。通过上下文,我可以访问从resx生成的源文件,而不是文件本身


    有没有一种方法可以在不出现此问题的情况下使用
    DTE
    ?或者是否有其他方法可以从
    代码重构提供程序
    访问项目项?

    还有其他方法(
    ((VisualStudioWorkspace)context.Document.project.Solution.Workspace)GetHierarchy(context.Document.project.Id);
    ),但它们也需要线程同步。你是说VSTHRD010警告吗?因为我没有在您的
    (DTE)包中复制它行。您可以检查您是否拥有所有最新的nuget软件包,或者推送一个复制项目somewhere@simonmourier是的,这是警告。我使用了
    ServiceProvider.GlobalProvider
    ,其中触发了wrning。无论警告是什么,消息的问题都应该是可复制的。您可以创建一个新的
    CodeRefactoringProvider
    项目并使用我提供的代码。这就是我复制这个问题所需要的。我没有说我不能复制“聚会”这个问题。我无法重现线程切换警告,您不必添加这一行,因此我请求重新生成警告。@SimonMourier正如我在尝试1中所写,删除这一行并不能解决问题。事实上,只要线程正常工作,我就可以不切换线程,并且解决方案中不存在其他问题。