工作區索引編製

在解決方案中,專案系統負責提供建置、偵錯、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的一或多個值。 如需範例掃描器,請參閱 VSSDK 範例

警告

請勿匯出支援 FileScannerTypeConstants.FileScannerContentType 類型的檔案掃描器。 它僅用於Microsoft內部用途。

在進階情況下,擴充功能可能會動態支援一組任意的文件類型。 延伸模組可以匯出 IWorkspaceProviderFactory<IFileScanner>,而不是 MEF 匯出 IWorkspaceProviderFactory<IFileScannerProvider>。 開始編製索引時,會匯入、實例化此工廠類型,並叫用其 GetSymbolScannersAsync 方法。 支援 IFileScanner 任何值的 FileScannerTpeConstants 實例將會被接受,而不僅限於符號。