Freigeben über


Arbeitsbereichsindizierung

In einer Lösung sind Projektsysteme für die Bereitstellung von Funktionen für Build, Debug, GoTo- Symbolsuche und vieles mehr verantwortlich. Projektsysteme können dies tun, da sie die Beziehung und die Funktionen von Dateien innerhalb eines Projekts verstehen. Ein Arbeitsbereich für offene Ordner benötigt den gleichen Einblick, um umfangreiche IDE-Features bereitzustellen. Die Sammlung und dauerhafte Speicherung dieser Daten ist ein Prozess, der als Arbeitsbereichsindizierung bezeichnet wird. Diese indizierten Daten können über eine Reihe asynchroner APIs abgefragt werden. Extender können sich am Indizierungsprozess beteiligen, indem sie IFileScanners bereitstellen, die wissen, wie bestimmte Dateitypen zu behandeln sind.

Typen von indizierten Daten

Es gibt drei Arten von Daten, die indiziert sind. Beachten Sie, dass der Typ, der von Dateiscannern erwartet wird, von dem Typ, der aus dem Index deserialisiert wird, abweicht.

Daten Dateiscannertyp Indexabfrageergebnistyp Verwandte Typen
Referenzen FileReferenceInfo FileReferenceResult FileReferenceInfoType
Symbole SymbolDefinition SymbolDefinitionSearchResult ISymbolService sollten anstelle von IIndexWorkspaceService für Abfragen verwendet werden.
Datenwerte FileDataValue FileDataResult<T>

Abfragen nach indizierten Daten

Es stehen zwei asynchrone Typen für den Zugriff auf gespeicherte Daten zur Verfügung. Der erste ist durch IIndexWorkspaceData. Sie bietet grundlegenden Zugriff auf die Daten FileReferenceResult und FileDataResult einer einzelnen Datei und zwischenspeichert die Ergebnisse. Die zweite ist die IIndexWorkspaceService, die keine Zwischenspeicherung verwendet, sondern mehr Abfragefunktionen ermöglicht.

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();
}

Teilnehmen an der Indizierung

Die Arbeitsbereichsindizierung folgt ungefähr der folgenden Sequenz:

  1. Ermittlung und Persistenz von Dateisystementitäten im Arbeitsbereich (nur beim ersten Öffnen des Scans).
  2. Pro Datei wird der übereinstimmende Anbieter mit der höchsten Priorität aufgefordert, nach FileReferenceInfos zu suchen.
  3. Pro Datei wird der übereinstimmende Anbieter mit der höchsten Priorität aufgefordert, nach SymbolDefinitions zu suchen.
  4. Pro Datei werden alle Anbieter nach FileDataValues gefragt.

Erweiterungen können einen Scanner exportieren, indem IWorkspaceProviderFactory<IFileScanner> implementiert und der Typ mit ExportFileScannerAttributeexportiert wird. Das Attributargument SupportedTypes sollte ein oder mehrere Werte aus FileScannerTypeConstantssein. Für einen Beispielscanner siehe das VSSDK Beispiel.

Warnung

Exportieren Sie keinen Dateiscanner, der den FileScannerTypeConstants.FileScannerContentType Typ unterstützt. Sie wird nur für interne Microsoft-Zwecke verwendet.

In erweiterten Situationen unterstützt eine Erweiterung möglicherweise dynamisch eine beliebige Gruppe von Dateitypen. Anstatt dass MEF IWorkspaceProviderFactory<IFileScanner>exportiert, kann eine Erweiterung IWorkspaceProviderFactory<IFileScannerProvider>exportieren. Wenn die Indizierung beginnt, wird dieser Factory-Typ importiert, instanziiert und seine GetSymbolScannersAsync-Methode wird aufgerufen. IFileScanner Instanzen, die einen beliebigen Wert von FileScannerTpeConstants unterstützen, werden beachtet, nicht nur Symbole.