在解決方案中,專案系統負責提供建置、偵錯、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的一或多個值。 如需範例掃描器,請參閱 VSSDK 範例。
警告
請勿匯出支援 FileScannerTypeConstants.FileScannerContentType 類型的檔案掃描器。 它僅用於Microsoft內部用途。
在進階情況下,擴充功能可能會動態支援一組任意的文件類型。 延伸模組可以匯出 IWorkspaceProviderFactory<IFileScanner>,而不是 MEF 匯出 IWorkspaceProviderFactory<IFileScannerProvider>。 開始編製索引時,會匯入、實例化此工廠類型,並叫用其 GetSymbolScannersAsync 方法。 支援 IFileScanner 任何值的 FileScannerTpeConstants 實例將會被接受,而不僅限於符號。