工作区索引

在解决方案中,项目系统负责提供用于生成、调试、GoTo 符号搜索等功能。 项目系统可以执行此操作,因为它们了解项目中文件的关系和功能。 打开文件夹工作区也需要相同的见解来提供丰富的 IDE 功能。 此数据的收集和持久存储是一个称为工作区索引的过程。 可以通过一组异步 API 查询此索引数据。 扩展程序可以通过提供知道如何处理某些类型的文件的 IFileScanner 来参与索引过程。

索引数据的类型

有三种类型的数据已编制索引。 请注意,文件扫描程序应提供的类型与从索引反序列化的类型不同。

数据 文件扫描程序类型 索引查询结果类型 相关类型
参考 FileReferenceInfo FileReferenceResult FileReferenceInfoType
符号 SymbolDefinition SymbolDefinitionSearchResult 应将 ISymbolService 而不是 IIndexWorkspaceService 应用于查询
数据值 FileDataValue FileDataResult<T>

查询索引数据

有两种异步类型可用于访问持久化数据。 第一种类型通过 IIndexWorkspaceData。 它提供对单个文件的 FileReferenceResultFileDataResult 数据的基本访问权限,并缓存结果。 第二种类型是不使用缓存的 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();
}

参与索引编制

工作区索引大致遵循以下顺序:

  1. 工作区中文件系统实体的发现和持久性(仅在初始打开扫描时)。
  2. 对于每个文件,将要求具有最高优先级的匹配提供程序扫描 FileReferenceInfo
  3. 对于每个文件,将要求具有最高优先级的匹配提供程序扫描 SymbolDefinition
  4. 对于每个文件,将要求所有提供程序提供 FileDataValue

扩展可以通过实现 IWorkspaceProviderFactory<IFileScanner> 并使用 ExportFileScannerAttribute 导出类型来导出扫描程序。 SupportedTypes 属性参数应为 FileScannerTypeConstants 中的一个或多个值。 有关示例扫描程序,请参阅 VS SDK 示例

警告

不要导出支持 FileScannerTypeConstants.FileScannerContentType 类型的文件扫描程序。 它仅用于 Microsoft 内部用途。

在高级情况下,扩展可能会动态支持任意一组文件类型。 扩展可以导出 IWorkspaceProviderFactory<IFileScanner>,而不是 MEF 导出 IWorkspaceProviderFactory<IFileScannerProvider>。 索引开始时,将导入、实例化此工厂类型并调用其 GetSymbolScannersAsync 方法。 IFileScanner 支持来自 FileScannerTpeConstants 的任何值的实例将被接受,而不仅仅是符号。