我想通过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 :
如果我实际上使用DTE
界面或添加一些实际的CodeAction
对象,则实际上完全不相关。仅仅获得服务就足够了。
我尝试了以下方法来解决此问题,但没有任何运气:
SwitchToMainThreadAsync
的呼叫(并忽略了警告)。该消息仍然显示。DTE
接口,但该接口不起作用(如this Q&A中所述)JoinableTaskFactory.RunAsync
开始的另一个线程中的项目文件。然后在任务上调用JoinAsync
。问题仍然存在。await TaskScheduler.Default
返回到原始线程。再没有运气了。在这种情况下,无法通过CodeRefactoringContext
枚举文件,因为它仅包含C#文件,我也需要访问其他文件类型。我特别需要访问resx
文件。通过上下文,我可以访问从resx生成的源文件,而不是文件本身。
是否可以使用DTE
而不会发生此问题?还是有其他方法可以从CodeRefactoringProvider
访问项目项?