Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В решении системы проектов отвечают за предоставление функциональных возможностей для создания, отладки, поиска символов GoTo и многое другое. Системы проектов могут выполнять эту работу, так как они понимают отношение и возможности файлов в проекте. Рабочая область Open Folder требует того же анализа, чтобы обеспечить богатые возможности интегрированной среды разработки. Коллекция и постоянное хранение этих данных — это процесс, называемый индексированием рабочей области. Эти индексированные данные можно запрашивать с помощью набора асинхронных 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
s. - Для каждого файла поставщику сопоставления с наивысшим приоритетом предлагается проверить наличие
SymbolDefinition
s. - Для каждого файла все поставщики запрашиваются на предоставление
FileDataValue
единиц.
Расширения могут экспортировать сканер, осуществляя реализацию IWorkspaceProviderFactory<IFileScanner>
и экспортируя тип с помощью ExportFileScannerAttribute. Аргумент атрибута SupportedTypes
должен быть одним или несколькими значениями из FileScannerTypeConstants. В примере VSSDK см. пример сканера.
Предупреждение
Не экспортируйте сканер файлов, поддерживающий тип FileScannerTypeConstants.FileScannerContentType
. Он используется только для внутренних целей Майкрософт.
В сложных ситуациях расширение может динамически поддерживать произвольный набор типов файлов. Вместо того чтобы MEF экспортировал IWorkspaceProviderFactory<IFileScanner>
, расширение может экспортировать IWorkspaceProviderFactory<IFileScannerProvider>
. При начале индексирования этот тип фабрики будет импортирован, создан экземпляр и вызван его GetSymbolScannersAsync методом.
IFileScanner
экземпляры, поддерживающие любое значение из FileScannerTpeConstants
, будут учитываться, включая символы.
Связанное содержимое
- Рабочие пространства и языковые службы - Узнайте, как интегрировать языковые службы в рабочее пространство Open Folder.
- Сборка рабочей области. Функция "Открыть папку" поддерживает такие системы сборки, как MSBuild и makefiles.