次の方法で共有


ワークスペースのインデックス作成

ソリューションでは、プロジェクト システムがビルド、デバッグ、シンボルへ移動の検索などの機能を提供する役割を担います。 プロジェクト システムはプロジェクト内のファイルの関係と機能を把握しているため、この作業を行うことができます。 [フォルダーを開く] ワークスペースにも、豊富な IDE 機能を提供するために同じ分析情報が必要です。 このデータの収集と永続的な格納が、ワークスペースのインデックス作成と呼ばれるプロセスです。 このインデックス付きデータは、一連の非同期 API を使用して照会できます。 エクステンダーは、特定の種類のファイルの処理方法を認識する IFileScanner を指定することによって、インデックス作成プロセスに参加できます。

インデックス付きデータの型

3 種類のデータのインデックスが作成されます。 ファイル スキャナーから要求される型は、インデックスから逆シリアル化される型とは異なることに注意してください。

Data ファイル スキャナーの型 インデックス クエリの結果の型 関連する型
References FileReferenceInfo FileReferenceResult FileReferenceInfoType
記号 SymbolDefinition SymbolDefinitionSearchResult クエリに対しては、IIndexWorkspaceService ではなく ISymbolService を使用する必要があります。
データの値 FileDataValue FileDataResult<T>

インデックス付きデータのクエリ

持続的なデータにアクセスするには、2 つの非同期型を使用できます。 1 つ目は IIndexWorkspaceData を使用する方法です。 これは、1 つのファイルの FileReferenceResultFileDataResult データへの基本的なアクセスを提供し、結果をキャッシュします。 2 つ目は 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 が要求されます。

拡張機能では、ExportFileScannerAttribute を使用して IWorkspaceProviderFactory<IFileScanner> を実装し、型をエクスポートすることによって、スキャナーをエクスポートできます。 SupportedTypes 属性引数は、FileScannerTypeConstants から取得する 1 つ以上の値である必要があります。 スキャナーの例については、VSSDK のサンプルを参照してください。

警告

FileScannerTypeConstants.FileScannerContentType 型をサポートするファイル スキャナーをエクスポートしないでください。 これは、Microsoft の内部目的にのみ使用されます。

高度な状況では、任意のセットのファイルの種類が拡張機能で動的にサポートされる場合があります。 MEF による IWorkspaceProviderFactory<IFileScanner> のエクスポートの代わりに、拡張機能で IWorkspaceProviderFactory<IFileScannerProvider> をエクスポートできます。 インデックス作成が開始されると、このファクトリ型がインポートされ、インスタンス化されて、その GetSymbolScannersAsync メソッドが呼び出されます。 シンボルだけでなく、FileScannerTpeConstants から取得する任意の値をサポートする IFileScanner インスタンスが受け入れられます。