C# CodeRefactoringProvider使Visual Studio从;收集建议”;获得DTE服务后
我想从Visual Studio 2017 VSIX项目中的自定义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
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
的调用(并忽略了警告)。消息仍然显示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中所写,删除这一行并不能解决问题。事实上,只要线程正常工作,我就可以不切换线程,并且解决方案中不存在其他问题。