Настройка запуска
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Вы можете настроить процесс запуска для Visual Studio несколькими способами, например, открыв последнее решение или просто пустую среду разработки.
Изменение автозапускаемого элемента
- В строке меню выберите пункт Сервис>Параметры.
- Разверните узел «Среда«, а затем выберите «Запуск«.
- В открываемом списке выберите то, что нужно выполнить после запуска Visual Studio. Вы можете выбрать окно запуска (в котором можно открыть новый или существующий проект), последние решения или пустую среду.
- В строке меню выберите пункт Сервис>Параметры.
- Разверните узел «Среда«, а затем выберите «Общие«.
- В открываемом списке выберите то, что нужно выполнить после запуска Visual Studio. Вы можете выбрать окно «Пуск» (где можно открыть новый или существующий проект), последнее решение или пустую среду.
Присоединение к выполняемым процессам с использованием отладчика Visual Studio
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Отладчик Visual Studio можно подключить к запущенному процессу на локальном или удаленном компьютере. После выполнения процесса выберите Отладка>Подключить к процессу или нажмите клавишиCTRL+ALT+P в Visual Studio и используйте диалоговое окно Подключение к процессу, чтобы подключить отладчик к процессу.
Параметр Подключить к процессу можно использовать для отладки запущенных приложений на локальных или удаленных компьютерах, одновременной отладки нескольких процессов, отладки приложений, которые не были созданы в Visual Studio, или отладки любого приложения, которое не было запущено из Visual Studio с прикрепленным отладчиком. Например, если вы используете приложение без отладчика и столкнулись с исключением, можно присоединить отладчик к процессу, в котором выполняется приложение, и начать отладку.
Не уверены, следует ли использовать параметр Подключить к процессу для сценария отладки? См. раздел Общие сценарии отладки.
Присоединение к запущенному процессу на локальном компьютере
Сведения о том, как быстро присоединиться к процессу, подключенному ранее, см. в разделе Повторное подключение к процессу.
Порядок присоединения к процессу на локальном компьютере
- В Visual Studio выберите Отладка>Подключить к процессу (или нажмите клавиши CTRL+ALT+P), чтобы открыть диалоговое окно Подключение к процессу.
- Проверьте значение параметра Тип подключения. В большинстве случаев можно использовать значение По умолчанию. Для некоторых сценариев может потребоваться другой тип подключения. Дополнительные сведения см. в других разделах этой статьи, а также в разделе Общие сценарии отладки.
- В поле Цель подключения укажите имя локального компьютера.


- Чтобы быстро выбрать процесс, введите его имя или первую букву в поле Фильтр процессов.
- Если вы не знаете имя процесса, просмотрите список или обратитесь к разделу Общие сценарии отладки, чтобы ознакомиться с некоторыми распространенными именами процессов.
Процессы могут запускаться и останавливаться в фоновом режиме, пока диалоговое окно Подключение к процессу открыто, поэтому список запущенных процессов может не всегда быть актуальным. Чтобы просмотреть актуальный список, можно в любое время нажать кнопку Обновить.
- Щелкните Выбрать.
- В диалоговом окне Выбор типа кода нажмите кнопку Выполнять отладку кода следующих типов. Если при попытке подключиться к процессу из списка возникает ошибка, можно воспользоваться диалоговым окном Выбор типа кода, чтобы устранить неполадку.
- Выберите типы кода, которые необходимо отладить.
- Нажмите ОК.
В сценарии с несколькими идентичными процессами вы можете указать процесс с использованием столбца командной строки или сведений о процессе w3wp из столбца заголовка.
Во время отладки можно подключиться к нескольким приложениям, но в любой момент времени только один из них активен в отладчике. Можно выбрать текущую программу в панели инструментов Место отладки или окне Процессы в Visual Studio.
Присоединение к процессу на удаленном компьютере
В диалоговом окне Подключение к процессу также можно выбрать удаленный компьютер, просмотреть список доступных процессов, запущенных на этом компьютере, и подключиться к одному или нескольким процессам для отладки. На удаленном компьютере должен выполняться удаленный отладчик (msvsmon.exe). Дополнительные сведения см. в статье Удаленная отладка.
Более полные инструкции по отладке приложений ASP.NET, развернутых в службах IIS, см. в разделе Удаленная отладка ASP.NET на удаленном компьютере IIS.
Присоединение к выполняющемуся процессу на удаленном компьютере
- В Visual Studio выберите Отладка>Подключить к процессу (или нажмите клавиши CTRL+ALT+P), чтобы открыть диалоговое окно Подключение к процессу.
- Проверьте значение параметра Тип подключения. В большинстве случаев можно использовать значение По умолчанию. В некоторых сценариях, таких как отладка Linux или контейнерного приложения, требуется другой тип подключения. Дополнительные сведения см. в других разделах этой статьи, а также в разделе Общие сценарии отладки.
- В поле Целевой объект подключения выберите удаленный компьютер одним из следующих способов.
- Щелкните стрелку раскрывающегося списка Целевой объект подключения и выберите из раскрывающегося списка имя компьютера.
- Введите имя компьютера в поле Целевой объект подключения и нажмите клавишу ВВОД. Убедитесь, что Visual Studio добавляет требуемый порт в имя компьютера, которое отображается в формате: :порт
Примечание. Если вы не можете подключиться с помощью имени удаленного компьютера, попробуйте использовать IP-адрес и порт (например, 123.45.678.9:4022 ). 4026 — это порт по умолчанию для удаленного отладчика Visual Studio 2022. Сведения о других назначениях портов удаленного отладчика см. в разделе Назначение портов удаленного отладчика.
Примечание. Если вы не можете подключиться с помощью имени удаленного компьютера, попробуйте использовать IP-адрес и порт (например, 123.45.678.9:4022 ). 4024 — это порт по умолчанию для удаленного отладчика Visual Studio 2019. Сведения о других назначениях портов удаленного отладчика см. в разделе Назначение портов удаленного отладчика.
Значение параметра Тип подключения сохраняется между сеансами отладки. Параметр Целевой объект подключения хранится между сеансами отладки только в случае успешного подключения отладки с этим целевым объектом.
Совет Процессы могут запускаться и останавливаться в фоновом режиме, пока диалоговое окно Подключение к процессу открыто, поэтому список запущенных процессов может не всегда быть актуальным. Чтобы просмотреть актуальный список, можно в любое время нажать кнопку Обновить.
- Чтобы быстро выбрать процесс, введите его имя или первую букву в поле Фильтр процессов.
- Если вы не знаете имя процесса, просмотрите список или обратитесь к разделу Общие сценарии отладки, чтобы ознакомиться с некоторыми распространенными именами процессов.
- Чтобы найти процесс, который выполняется с другой учетной записью пользователя, установите флажок Показать процессы всех пользователей.
Примечание. Если попытаться подключиться к процессу, работающему под управлением ненадежной учетной записи, появится диалоговое окно подтверждения с предупреждением безопасности. Дополнительные сведения см. в разделе предупреждение системы безопасности: Присоединение к процессу, принадлежит недоверенному пользователю может быть опасно. Если следующие сведения не вызывают доверия, то не следует присоединяться к процессу.
- Щелкните Выбрать.
- В диалоговом окне Выбор типа кода нажмите кнопку Выполнять отладку кода следующих типов. Если при попытке подключиться к процессу из списка возникает ошибка, можно воспользоваться диалоговым окном Выбор типа кода, чтобы устранить неполадку.
- Нажмите ОК.
Во время отладки можно подключиться к нескольким приложениям, но в любой момент времени только один из них активен в отладчике. Можно выбрать текущую программу в панели инструментов Место отладки или окне Процессы в Visual Studio.
В некоторых случаях при отладке в сеансе удаленного рабочего стола (службы терминалов) в списке Доступные процессы не отображаются все доступные процессы. При работе с Visual Studio в качестве пользователя с ограниченным доступом в списке Доступные процессы не будут отображаться процессы, запущенные в сеансе 0, который используется для служб и других серверных процессов, включая w3wp.exe. Можно разрешить эту проблему, запустив Visual Studio с учетной записью администратора или запустив Visual Studio с консоли сервера вместо сеанса служб терминалов.
Если ни один из этих обходных путей использовать невозможно, третий вариант — присоединение к процессу путем запуска vsjitdebugger.exe -p из командной строки Windows. Можно определить идентификатор процесса с помощью tlist.exe. Чтобы получить файл tlist.exe, скачайте и установите средства отладки для Windows, которые доступны на странице скачиваемых файлов WDK и WinDbg.
Подключение к процессу .NET Core, выполняемому в Службе приложений Azure (Windows)
Если публикация выполняется в Службу приложений Azure (Windows), инструкции см. в статье об удаленной отладке ASP.NET Core в Azure или отладке служб приложение Azure.
Подключение к процессу .NET Core, выполняемому в Службе приложений Azure (Windows)
Если вы выполняете публикацию в Службу приложений Azure (Windows), параметр Подключить отладчик можно найти в меню . в разделе Размещение в профиле публикации. Visual Studio пытается подключить удаленный отладчик к экземпляру Службы приложений Azure (Windows), в котором публикуется профиль.

Подключение к процессу .NET Core под управлением Linux с помощью SSH
Присоединение к процессу, выполняющемуся в контейнере Docker
Начиная с Visual Studio 2019 можно подключить отладчик Visual Studio к процессу, выполняющемуся в контейнере Docker. Для контейнеров Docker в .NET Core для Linux см. раздел Присоединение к процессу, выполняющемуся в контейнере Docker для Linux. Для контейнеров Docker в Windows см. раздел Присоединение к процессу, выполняющемуся в контейнере Docker для Windows.
Повторное присоединение к процессу
Чтобы быстро присоединиться к процессам, к которым вы ранее были присоединены, выберите Отладка>Повторно подключиться к процессу (SHIFT+ALT+P). При выборе этой команды отладчик сразу же попытается присоединиться к последним процессам, к которым вы подключались, сначала попытавшись выполнить сопоставление с ИД предыдущего процесса, а если это не удается, то путем сопоставления с именем предыдущего процесса. Если совпадений не найдено или несколько процессов имеют одно и то же имя, откроется диалоговое окно Подключение к процессу, в котором можно выбрать правильный процесс.
Команда Повторно подключиться к процессу доступна начиная с Visual Studio 2017.
Распространенные сценарии отладки
Чтобы определить, следует ли использовать команду Подключиться к процессу и к какому процессу подключиться, используйте таблицу ниже, в которой приведены несколько распространенных сценариев отладки со ссылками на дополнительные инструкции, где это возможно. (Этот список не является исчерпывающим.)
Для некоторых типов приложений, например универсальных приложений для Windows (UWP), не следует напрямую подключаться к имени процесса. Вместо этого необходимо использовать команду Отладка установленного пакета приложения в Visual Studio (см. таблицу).
Чтобы отладчик мог присоединиться к коду на языке C++, код должен предоставлять DebuggableAttribute . Это можно добавить в код автоматически, путем связывания с параметром /ASSEMBLYDEBUG компоновщика.
Для отладки скриптов на стороне клиента в браузере должна быть включена отладка скриптов. Для отладки клиентского скрипта в Chrome выберите JavaScript или TypeScript в качестве типа кода и в зависимости от типа приложения может потребоваться закрыть все экземпляры Chrome и запустить браузер в режиме отладки (введите chrome.exe —remote-debugging-port=9222 из командной строки).
Для отладки скриптов на стороне клиента в браузере должна быть включена отладка скриптов. Для отладки клиентского скрипта в Chrome выберите JavaScript (Chrome) или JavaScript (Microsoft Edge — Chromium) в качестве типа кода, и, в зависимости от типа приложения, может потребоваться закрыть все экземпляры Chrome и запустить браузер в режиме отладки (введите chrome.exe —remote-debugging-port=9222 в командной строке). В более ранних версиях Visual Studio в качестве отладчика скриптов для Chrome использовался Веб-пакет.
Чтобы быстро выбрать выполняющийся процесс для подключения, в Visual Studio нажмите клавиши CTRL+ALT+P, а затем введите первую букву имени процесса.
| Сценарий | Метод отладки | Имя процесса | Примечания и ссылки |
|---|---|---|---|
| ASP.NET Core — удаленная отладка на сервере IIS | Используйте инструменты удаленной отладки и функцию Подключиться к процессу | w3wp.exe или dotnet.exe | Начиная с .NET Core 3 процесс w3wp.exe используется для модели размещения в приложении по умолчанию. Сведения о развертывании приложений см. в разделе Публикация в службах IIS. Дополнительные сведения см. в разделе Удаленная отладка ASP.NET Core на удаленном компьютере IIS |
| ASP.NET Core — отладка приложения на локальном компьютере после запуска приложения без отладчика | Используйте функцию Подключиться к процессу | msedge.exe | Это может быть полезно для ускорения загрузки приложения, например при профилировании. |
| ASP.NET 4 или 4.5 — удаленная отладка на сервере IIS | Используйте инструменты удаленной отладки и функцию Подключиться к процессу | w3wp.exe | См. раздел Удаленная отладка ASP.NET на удаленном компьютере IIS |
| Скрипт на стороне клиента — отладка на локальном сервере IIS для поддерживаемых типов приложений | Используйте функцию Подключиться к процессу | chrome.exe или msedge.exe | Необходимо включить отладку скриптов. Для Chrome необходимо также запустить Chrome в режиме отладки (введите chrome.exe —remote-debugging-port=9222 из командной строки) и выбрать JavaScript или TypeScript в поле «Подключение». |
| Приложение C#, Visual Basic или C++ — отладка на локальном компьютере | Используйте стандартную отладку (F5) или функцию Подключиться к процессу | .exe | В большинстве случаев используется стандартная отладка, а не функция Подключиться к процессу. |
| Классическое приложение Windows — удаленная отладка | Инструменты удаленной отладки | Неприменимо | См. раздел Удаленная отладка приложения C# или Visual Basic или Удаленная отладка приложения C++ |
| .NET Core в Linux — отладка | Используйте функцию Подключиться к процессу | dotnet.exe или уникальное имя процесса | Сведения об использовании см. в статье Удаленная отладка .NET Core в Linux с помощью SSH. Для контейнерных приложений см. раздел Присоединение к процессу, выполняющемуся в контейнере Docker. |
| Контейнерное приложение — отладка | Используйте функцию Подключиться к процессу | dotnet.exe или уникальное имя процесса | См. раздел Присоединение к процессу, выполняющемуся в контейнере Docker. |
| Python в Linux — удаленная отладка | Используйте функцию Подключиться к процессу | debugpy | См. раздел Удаленное подключение с помощью инструментов Python. |
| Другие поддерживаемые типы приложений — отладка в серверном процессе | Если сервер удаленный, используйте инструменты удаленной отладки и функцию Подключиться к процессу | chrome.exe, msedge.exe или другие процессы | При необходимости используйте монитор ресурсов, чтобы определить процесс. См. раздел Удаленная отладка. |
| Универсальное приложение для Windows (UWP), OneCore, HoloLens или Интернета вещей — удаленная отладка | Отладка установленного пакета приложения | Неприменимо | См. раздел Отладка установленного пакета приложения вместо использования функции Подключиться к процессу |
| Универсальное приложение для Windows (UWP), OneCore, HoloLens или Интернета вещей — отладка приложения, которое не было запущено из Visual Studio | Отладка установленного пакета приложения | Неприменимо | См. раздел Отладка установленного пакета приложения вместо использования функции Подключиться к процессу |
Использование функций отладчика
Чтобы использовать все функции отладчика Visual Studio (например, при обнаружении точек останова) при присоединении к процессу, приложение должно точно соответствовать локальным источнику и символам. То есть отладчик должен иметь возможность загрузки правильных файлов символов (PDB). По умолчанию для этого требуется отладочная сборка.
В сценариях удаленной отладки должен быть уже открыт исходный код (или копия исходного кода) в Visual Studio. Скомпилированные двоичные файлы приложения на удаленном компьютере должны поступать из той же сборки, что и на локальном компьютере.
В некоторых локальных сценариях отладки в Visual Studio можно выполнять отладку без доступа к источнику, если в приложении есть правильные файлы символов. По умолчанию для этого требуется отладочная сборка. Дополнительные сведения см. в разделе Указание файлов символов и исходных файлов.
Устранение ошибок присоединения
В некоторых сценариях отладчику может потребоваться помощь, чтобы правильно определить тип отлаживаемого кода. Если значения для подключения заданы правильно (проверить процесс можно в списке Доступные процессы), но отладчику не удается подключиться, попробуйте выбрать наиболее подходящий тип подключения в списке Тип подключения. Это может потребоваться, например, при отладке приложения Linux или Python. Если используется тип подключения «По умолчанию», можно также выбрать определенный тип кода для подключения, как описано далее в этом разделе.
При присоединении отладчика к выполняющемуся процессу этот процесс может содержать один или несколько типов кода. Типы кода, к которым может присоединиться отладчик, отображаются и выбираются в диалоговом окне Выбор типа кода .
Иногда отладчик может успешно присоединяться к одному типу кода, но не к другому. Это происходит в следующих случаях:
- При попытке присоединения к процессу, выполняющемуся на удаленном компьютере. На удаленном компьютере для одних типов кода могут иметься компоненты удаленной отладки, а для других — нет.
- При попытке присоединиться к двум или более процессам для прямой отладки базы данных. Отладка SQL поддерживает присоединение только к одному процессу.
Если отладчик может присоединиться не ко всем типам кода, отобразится сообщение со сведениями о типах, к которым присоединиться не удалось.
Если отладчик успешно подключается хотя бы к одному типу кода, то можно приступать к отладке процесса. Но отлаживать можно будет только те типы кода, к которым удалось подсоединиться. Неподключенный код в этом процессе будет по-прежнему выполняться, но задавать в этом коде точки останова, просматривать данные и выполнять другие операции отладки не удастся.
Если нужны более конкретные сведения о том, почему отладчику не удалось присоединиться к некоторому типу кода, попробуйте повторно присоединиться только к этому типу кода.
Чтобы получить подробные сведения о том, почему не удалось присоединиться к типу кода:
- Отключитесь от процесса. В меню Отладка выберите Отсоединить все.
- Вновь подключитесь к процессу, выбрав только тип кода.
- В диалоговом окне Присоединение к процессу выберите процесс в списке Доступные процессы.
- Нажмите Выбрать.
- В диалоговом окне Выбор типа кода выберите Выполнять отладку кода следующих типов и выберите тип кода, к которому не удалось присоединиться. Отмените выбор других типов кода.
- Нажмите ОК.
- В диалоговом окне Подключение к процессу нажмите Подключиться.
На этот раз присоединение не пройдет полностью, и будет выдано сообщение о конкретной ошибке.
См. также
- Отладка нескольких процессов
- JIT-отладка
- Удаленная отладка
Пошаговое руководство. Отображение подсказок QuickInfo
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code 
QuickInfo — это функция IntelliSense, которая отображает сигнатуры и описания методов при перемещении указателя на имя метода. Вы можете реализовать такие функции на основе языка, как QuickInfo, определив идентификаторы, для которых требуется предоставить описания QuickInfo, а затем создав подсказку, в которой будет отображаться содержимое. Вы можете определить QuickInfo в контексте языковой службы или определить собственное расширение имени файла и тип контента и отобразить QuickInfo только для этого типа или отобразить QuickInfo для существующего типа контента (например, «текст»). В этом пошаговом руководстве показано, как отобразить QuickInfo для типа контента «text».
В примере QuickInfo в этом пошаговом руководстве отображаются подсказки при перемещении указателя на имя метода. Для реализации этих четырех интерфейсов требуется:
- исходный интерфейс
- интерфейс поставщика источника
- интерфейс контроллера
- интерфейс поставщика контроллера Поставщики исходных и контроллеров являются компонентами компонента Managed Extensibility Framework (MEF), и отвечают за экспорт классов источника и контроллера и импорта служб и брокеров, таких как ITextBufferFactoryService, который создает текстовый буфер подсказки и IQuickInfoBroker, который активирует сеанс QuickInfo. В этом примере источник QuickInfo использует жестко закодированный список имен и описаний методов, но в полных реализациях языковая служба и документация по языку отвечают за предоставление этого содержимого.
Необходимые компоненты
Начиная с Visual Studio 2015, вам не нужно устанавливать пакет SDK Visual Studio из центра загрузки. Она включена в качестве необязательной функции в настройке Visual Studio. Пакет SDK для VS можно установить и позже. Дополнительные сведения см. в разделе «Установка пакета SDK для Visual Studio».
Создание проекта MEF
Создание проекта MEF
- Создайте проект VSIX на C#. (В Диалоговое окно «Новый проект» , выберите Visual C# / Расширяемость, а затем ПРОЕКТ VSIX.) Назовите решение QuickInfoTest .
- Добавьте в проект шаблон элемента классификатора редактора. Дополнительные сведения: Создание расширения с помощью шаблона элемента редактора.
- Удалите файлы существующих классов.
Реализация источника QuickInfo
Источник QuickInfo отвечает за сбор набора идентификаторов и их описания и добавление содержимого в текстовый буфер подсказки при обнаружении одного из идентификаторов. В этом примере идентификаторы и их описания просто добавляются в исходный конструктор.
Реализация источника QuickInfo
- Добавьте файл класса с именем TestQuickInfoSource .
- Добавьте ссылку на Microsoft.VisualStudio.Language.IntelliSense.
- Добавьте приведенные ниже импортированные данные.
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel.Composition; using Microsoft.VisualStudio.Language.Intellisense; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Operations; using Microsoft.VisualStudio.Text.Tagging; using Microsoft.VisualStudio.Utilities;Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.Collections.ObjectModel Imports System.ComponentModel.Composition Imports Microsoft.VisualStudio.Language.Intellisense Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Operations Imports Microsoft.VisualStudio.Text.Tagging Imports Microsoft.VisualStudio.Utilitiesinternal class TestQuickInfoSource : IQuickInfoSourceFriend Class TestQuickInfoSource Implements IQuickInfoSourceprivate TestQuickInfoSourceProvider m_provider; private ITextBuffer m_subjectBuffer; private Dictionary m_dictionary;Private m_provider As TestQuickInfoSourceProvider Private m_subjectBuffer As ITextBuffer Private m_dictionary As Dictionary(Of String, String)public TestQuickInfoSource(TestQuickInfoSourceProvider provider, ITextBuffer subjectBuffer) < m_provider = provider; m_subjectBuffer = subjectBuffer; //these are the method names and their descriptions m_dictionary = new Dictionary(); m_dictionary.Add("add", "int add(int firstInt, int secondInt)\nAdds one integer to another."); m_dictionary.Add("subtract", "int subtract(int firstInt, int secondInt)\nSubtracts one integer from another."); m_dictionary.Add("multiply", "int multiply(int firstInt, int secondInt)\nMultiplies one integer by another."); m_dictionary.Add("divide", "int divide(int firstInt, int secondInt)\nDivides one integer by another."); >Public Sub New(ByVal provider As TestQuickInfoSourceProvider, ByVal subjectBuffer As ITextBuffer) m_provider = provider m_subjectBuffer = subjectBuffer 'these are the method names and their descriptions m_dictionary = New Dictionary(Of String, String)() m_dictionary.Add("add", "int add(int firstInt, int secondInt)" & vbLf & "Adds one integer to another.") m_dictionary.Add("subtract", "int subtract(int firstInt, int secondInt)" & vbLf & "Subtracts one integer from another.") m_dictionary.Add("multiply", "int multiply(int firstInt, int secondInt)" & vbLf & "Multiplies one integer by another.") m_dictionary.Add("divide", "int divide(int firstInt, int secondInt)" & vbLf & "Divides one integer by another.") End Subpublic void AugmentQuickInfoSession(IQuickInfoSession session, IList qiContent, out ITrackingSpan applicableToSpan) < // Map the trigger point down to our buffer. SnapshotPoint? subjectTriggerPoint = session.GetTriggerPoint(m_subjectBuffer.CurrentSnapshot); if (!subjectTriggerPoint.HasValue) < applicableToSpan = null; return; >ITextSnapshot currentSnapshot = subjectTriggerPoint.Value.Snapshot; SnapshotSpan querySpan = new SnapshotSpan(subjectTriggerPoint.Value, 0); //look for occurrences of our QuickInfo words in the span ITextStructureNavigator navigator = m_provider.NavigatorService.GetTextStructureNavigator(m_subjectBuffer); TextExtent extent = navigator.GetExtentOfWord(subjectTriggerPoint.Value); string searchText = extent.Span.GetText(); foreach (string key in m_dictionary.Keys) < int foundIndex = searchText.IndexOf(key, StringComparison.CurrentCultureIgnoreCase); if (foundIndex >-1) < applicableToSpan = currentSnapshot.CreateTrackingSpan ( //querySpan.Start.Add(foundIndex).Position, 9, SpanTrackingMode.EdgeInclusive extent.Span.Start + foundIndex, key.Length, SpanTrackingMode.EdgeInclusive ); string value; m_dictionary.TryGetValue(key, out value); if (value != null) qiContent.Add(value); else qiContent.Add(""); return; >> applicableToSpan = null; >Public Sub AugmentQuickInfoSession(ByVal session As IQuickInfoSession, ByVal qiContent As IList(Of Object), ByRef applicableToSpan As ITrackingSpan) Implements IQuickInfoSource.AugmentQuickInfoSession ' Map the trigger point down to our buffer. Dim subjectTriggerPoint As System.Nullable(Of SnapshotPoint) = session.GetTriggerPoint(m_subjectBuffer.CurrentSnapshot) If Not subjectTriggerPoint.HasValue Then applicableToSpan = Nothing Exit Sub End If Dim currentSnapshot As ITextSnapshot = subjectTriggerPoint.Value.Snapshot Dim querySpan As New SnapshotSpan(subjectTriggerPoint.Value, 0) 'look for occurrences of our QuickInfo words in the span Dim navigator As ITextStructureNavigator = m_provider.NavigatorService.GetTextStructureNavigator(m_subjectBuffer) Dim extent As TextExtent = navigator.GetExtentOfWord(subjectTriggerPoint.Value) Dim searchText As String = extent.Span.GetText() For Each key As String In m_dictionary.Keys Dim foundIndex As Integer = searchText.IndexOf(key, StringComparison.CurrentCultureIgnoreCase) If foundIndex > -1 Then 'applicableToSpan = currentSnapshot.CreateTrackingSpan(querySpan.Start.Add(foundIndex).Position, 9, SpanTrackingMode.EdgeInclusive) applicableToSpan = currentSnapshot.CreateTrackingSpan(extent.Span.Start + foundIndex, key.Length, SpanTrackingMode.EdgeInclusive) Dim value As String = "" m_dictionary.TryGetValue(key, value) If value IsNot Nothing Then qiContent.Add(value) Else qiContent.Add("") End If Exit Sub End If Next applicableToSpan = Nothing End Subprivate bool m_isDisposed; public void Dispose() < if (!m_isDisposed) < GC.SuppressFinalize(this); m_isDisposed = true; >>Private m_isDisposed As Boolean Public Sub Dispose() Implements IDisposable.Dispose If Not m_isDisposed Then GC.SuppressFinalize(Me) m_isDisposed = True End If End SubРеализация поставщика источника QuickInfo
Поставщик источника QuickInfo служит в первую очередь для экспорта в качестве части компонента MEF и создания экземпляра источника QuickInfo. Так как это часть компонента MEF, она может импортировать другие компоненты MEF.
Реализация поставщика источника QuickInfo
- Объявите поставщик источника QuickInfo с именем TestQuickInfoSourceProvider , который реализует IQuickInfoSourceProviderи экспортирует его с NameAttribute помощью источника ToolTip QuickInfo, параметра OrderAttribute Before=»default» и ContentTypeAttribute «text».
[Export(typeof(IQuickInfoSourceProvider))] [Name("ToolTip QuickInfo Source")] [Order(Before = "Default Quick Info Presenter")] [ContentType("text")] internal class TestQuickInfoSourceProvider : IQuickInfoSourceProvider__ _ _ Friend Class TestQuickInfoSourceProvider Implements IQuickInfoSourceProvider [Import] internal ITextStructureNavigatorSelectorService NavigatorService < get; set; >[Import] internal ITextBufferFactoryService TextBufferFactoryService
Private _NavigatorService As ITextStructureNavigatorSelectorService _ Friend Property NavigatorService() As ITextStructureNavigatorSelectorService Get Return _NavigatorService End Get Set(ByVal value As ITextStructureNavigatorSelectorService) _NavigatorService = value End Set End Property Private _TextBufferFactoryService As ITextBufferFactoryService _ Friend Property TextBufferFactoryService() As ITextBufferFactoryService Get Return _TextBufferFactoryService End Get Set(ByVal value As ITextBufferFactoryService) _TextBufferFactoryService = value End Set End Propertypublic IQuickInfoSource TryCreateQuickInfoSource(ITextBuffer textBuffer)
Public Function TryCreateQuickInfoSource(ByVal textBuffer As ITextBuffer) As IQuickInfoSource Implements IQuickInfoSourceProvider.TryCreateQuickInfoSource Return New TestQuickInfoSource(Me, textBuffer) End FunctionРеализация контроллера QuickInfo
Контроллеры QuickInfo определяют, когда отображается QuickInfo. В этом примере QuickInfo отображается, когда указатель находится над словом, соответствующим одному из имен методов. Контроллер QuickInfo реализует обработчик событий наведения указателя мыши, который активирует сеанс QuickInfo.
Реализация контроллера QuickInfo
- Объявите класс, реализующий IIntellisenseControllerи назовите его TestQuickInfoController .
internal class TestQuickInfoController : IIntellisenseControllerFriend Class TestQuickInfoController Implements IIntellisenseControllerprivate ITextView m_textView; private IList m_subjectBuffers; private TestQuickInfoControllerProvider m_provider; private IQuickInfoSession m_session;Private m_textView As ITextView Private m_subjectBuffers As IList(Of ITextBuffer) Private m_provider As TestQuickInfoControllerProvider Private m_session As IQuickInfoSessioninternal TestQuickInfoController(ITextView textView, IList subjectBuffers, TestQuickInfoControllerProvider provider)
Friend Sub New(ByVal textView As ITextView, ByVal subjectBuffers As IList(Of ITextBuffer), ByVal provider As TestQuickInfoControllerProvider) m_textView = textView m_subjectBuffers = subjectBuffers m_provider = provider AddHandler m_textView.MouseHover, AddressOf Me.OnTextViewMouseHover End Subprivate void OnTextViewMouseHover(object sender, MouseHoverEventArgs e) < //find the mouse position by mapping down to the subject buffer SnapshotPoint? point = m_textView.BufferGraph.MapDownToFirstMatch (new SnapshotPoint(m_textView.TextSnapshot, e.Position), PointTrackingMode.Positive, snapshot =>m_subjectBuffers.Contains(snapshot.TextBuffer), PositionAffinity.Predecessor); if (point != null) < ITrackingPoint triggerPoint = point.Value.Snapshot.CreateTrackingPoint(point.Value.Position, PointTrackingMode.Positive); if (!m_provider.QuickInfoBroker.IsQuickInfoActive(m_textView)) < m_session = m_provider.QuickInfoBroker.TriggerQuickInfo(m_textView, triggerPoint, true); >> >Private Sub OnTextViewMouseHover(ByVal sender As Object, ByVal e As MouseHoverEventArgs) 'find the mouse position by mapping down to the subject buffer Dim point As System.Nullable(Of SnapshotPoint) = m_textView.BufferGraph.MapDownToFirstMatch(New SnapshotPoint(m_textView.TextSnapshot, e.Position), PointTrackingMode.Positive, Function(snapshot) m_subjectBuffers.Contains(snapshot.TextBuffer), PositionAffinity.Predecessor) If point IsNot Nothing Then Dim triggerPoint As ITrackingPoint = point.Value.Snapshot.CreateTrackingPoint(point.Value.Position, PointTrackingMode.Positive) If Not m_provider.QuickInfoBroker.IsQuickInfoActive(m_textView) Then m_session = m_provider.QuickInfoBroker.TriggerQuickInfo(m_textView, triggerPoint, True) End If End If End Subpublic void Detach(ITextView textView) < if (m_textView == textView) < m_textView.MouseHover -= this.OnTextViewMouseHover; m_textView = null; >>Public Sub Detach(ByVal textView As ITextView) Implements IIntellisenseController.Detach If m_textView Is textView Then AddHandler m_textView.MouseHover, AddressOf Me.OnTextViewMouseHover m_textView = Nothing End If End Subpublic void ConnectSubjectBuffer(ITextBuffer subjectBuffer) < >public void DisconnectSubjectBuffer(ITextBuffer subjectBuffer)
Public Sub ConnectSubjectBuffer(ByVal subjectBuffer As ITextBuffer) Implements IIntellisenseController.ConnectSubjectBuffer End Sub Public Sub DisconnectSubjectBuffer(ByVal subjectBuffer As ITextBuffer) Implements IIntellisenseController.DisconnectSubjectBuffer End SubРеализация поставщика контроллера QuickInfo
Поставщик контроллера QuickInfo служит главным образом для экспорта в качестве части компонента MEF и создания экземпляра контроллера QuickInfo. Так как это часть компонента MEF, она может импортировать другие компоненты MEF.
Реализация поставщика контроллера QuickInfo
- Объявите класс с именем TestQuickInfoControllerProvider , реализующий IIntellisenseControllerProviderи экспортируйте его с NameAttribute помощью контроллера QuickInfo ToolTip и ContentTypeAttribute текстового элемента:
[Export(typeof(IIntellisenseControllerProvider))] [Name("ToolTip QuickInfo Controller")] [ContentType("text")] internal class TestQuickInfoControllerProvider : IIntellisenseControllerProvider__ _ Friend Class TestQuickInfoControllerProvider Implements IIntellisenseControllerProvider [Import] internal IQuickInfoBroker QuickInfoBroker
Private _QuickInfoBroker As IQuickInfoBroker _ Friend Property QuickInfoBroker() As IQuickInfoBroker Get Return _QuickInfoBroker End Get Set(ByVal value As IQuickInfoBroker) _QuickInfoBroker = value End Set End Propertypublic IIntellisenseController TryCreateIntellisenseController(ITextView textView, IList subjectBuffers)
Public Function TryCreateIntellisenseController(ByVal textView As ITextView, ByVal subjectBuffers As IList(Of ITextBuffer)) As IIntellisenseController Implements IIntellisenseControllerProvider.TryCreateIntellisenseController Return New TestQuickInfoController(textView, subjectBuffers, Me) End FunctionСборка и проверка кода
Чтобы протестировать этот код, создайте решение QuickInfoTest и запустите его в экспериментальном экземпляре.
Создание и тестирование решения QuickInfoTest
- Постройте решение.
- При запуске этого проекта в отладчике запускается второй экземпляр Visual Studio.
- Создайте текстовый файл и введите текст, включающий слова «добавить» и «вычитать».
- Переместите указатель на один из вхождения «add». Подпись и описание add метода должны отображаться.
См. также
Обучение кодированию в Visual Studio

Чтобы разработать приложение любого типа или изучить язык, вы будете работать в интегрированной среде разработки Visual Studio (IDE). Помимо изменения кода, Visual Studio IDE объединяет графические конструкторы, компиляторы, средства завершения кода, системы управления версиями, расширения и многие другие функции в одном месте.
Просмотрите это короткое видео, чтобы ознакомиться с интегрированной средой разработки и узнать, как использовать ее для базовых задач.
Скачать и установить последнюю версию Visual Studio, чтобы начать работу. Visual Studio предоставляется бесплатно для изучения и индивидуального использования. Вы можете сократить время установки и сэкономить место на диске, выбрав только компоненты нужные. При необходимости вы можете постепенно добавлять другие компоненты позже в любое время.
