工作区索引
在解决方案中,项目系统负责提供用于生成、调试、GoTo 符号搜索等功能。 项目系统可以执行此操作,因为它们了解项目中文件的关系和功能。 打开文件夹工作区也需要相同的见解来提供丰富的 IDE 功能。 此数据的收集和持久存储是一个称为工作区索引的过程。 可以通过一组异步 API 查询此索引数据。 扩展程序可以通过提供知道如何处理某些类型的文件的 IFileScanner 来参与索引过程。
索引数据的类型
有三种类型的数据已编制索引。 请注意,文件扫描程序应提供的类型与从索引反序列化的类型不同。
数据 | 文件扫描程序类型 | 索引查询结果类型 | 相关类型 |
---|---|---|---|
参考 | FileReferenceInfo | FileReferenceResult | FileReferenceInfoType |
符号 | SymbolDefinition | SymbolDefinitionSearchResult | 应将 ISymbolService 而不是 IIndexWorkspaceService 应用于查询 |
数据值 | FileDataValue | FileDataResult<T> |
查询索引数据
有两种异步类型可用于访问持久化数据。 第一种类型通过 IIndexWorkspaceData。 它提供对单个文件的 FileReferenceResult
和 FileDataResult
数据的基本访问权限,并缓存结果。 第二种类型是不使用缓存的 IIndexWorkspaceService,但其允许更多查询功能。
using Microsoft.VisualStudio.Workspace;
using Microsoft.VisualStudio.Workspace.Indexing;
private static IIndexWorkspaceData GetCachedIndexedData(IWorkspace workspace)
{
// Gets access to indexed data wrapped in a cache.
return workspace?.GetIndexWorkspaceDataService()?.CreateIndexWorkspaceData();
}
private static IIndexWorkspaceService GetDirectIndexedData(IWorkspace workspace)
{
// Gets direct access to indexed data.
// Can also be casted to IIndexWorkspaceService2.
return workspace?.GetIndexWorkspaceService();
}
参与索引编制
工作区索引大致遵循以下顺序:
- 工作区中文件系统实体的发现和持久性(仅在初始打开扫描时)。
- 对于每个文件,将要求具有最高优先级的匹配提供程序扫描
FileReferenceInfo
。 - 对于每个文件,将要求具有最高优先级的匹配提供程序扫描
SymbolDefinition
。 - 对于每个文件,将要求所有提供程序提供
FileDataValue
。
扩展可以通过实现 IWorkspaceProviderFactory<IFileScanner>
并使用 ExportFileScannerAttribute 导出类型来导出扫描程序。 SupportedTypes
属性参数应为 FileScannerTypeConstants 中的一个或多个值。 有关示例扫描程序,请参阅 VS SDK 示例。
警告
不要导出支持 FileScannerTypeConstants.FileScannerContentType
类型的文件扫描程序。 它仅用于 Microsoft 内部用途。
在高级情况下,扩展可能会动态支持任意一组文件类型。 扩展可以导出 IWorkspaceProviderFactory<IFileScanner>
,而不是 MEF 导出 IWorkspaceProviderFactory<IFileScannerProvider>
。 索引开始时,将导入、实例化此工厂类型并调用其 GetSymbolScannersAsync 方法。 IFileScanner
支持来自 FileScannerTpeConstants
的任何值的实例将被接受,而不仅仅是符号。