Основные компоненты службы
Служба — это контракт между двумя пакетами VSPackage. Один VSPackage предоставляет определенный набор интерфейсов для использования другого VSPackage. Visual Studio — это коллекция VSPackages, которая предоставляет службы другим пакетам VSPackage.
Например, можно использовать службу SVsActivityLog для получения интерфейса IVsActivityLog, который можно использовать для записи в журнал действий. Дополнительные сведения см. в разделе "Практическое руководство. Использование журнала действий".
Visual Studio также предоставляет некоторые встроенные службы, которые не зарегистрированы. VSPackages может заменить встроенные или другие службы, предоставив переопределение службы. Для любой службы разрешено только одно переопределение службы.
Службы не имеют возможности обнаружения. Поэтому необходимо знать идентификатор службы (SID) службы, которую вы хотите использовать, и необходимо знать, какие интерфейсы он предоставляет. Справочная документация для службы предоставляет эти сведения.
VSPackage, предоставляющие службы, называются поставщиками услуг.
Службы, предоставляемые другим VSPackage, называются глобальными службами.
Службы, доступные только для VSPackage, реализующего их, или для любого объекта, который он создает, называются локальными службами.
Службы, заменяющие встроенные службы или службы, предоставляемые другими пакетами, называются переопределениями служб.
Службы или переопределения служб загружаются по запросу, то есть поставщик услуг загружается, когда служба, которую она предоставляет, запрашивается другим VSPackage.
Для поддержки загрузки по запросу поставщик услуг регистрирует свои глобальные службы в Visual Studio. Дополнительные сведения см. в разделе "Практическое руководство. Предоставление службы".
После получения службы используйте QueryInterface (неуправляемый код) или приведение (управляемый код), чтобы получить нужный интерфейс, например:
Управляемый код относится к службе по типу, а неуправляемый код ссылается на службу с помощью GUID.
Когда Visual Studio загружает VSPackage, он передает поставщику услуг в VSPackage, чтобы предоставить VSPackage доступ к глобальным службам. Это называется "сидящие" VSPackage.
VSPackages могут быть поставщиками услуг для создаваемых объектов. Например, форма может отправить запрос на цветовую службу в кадр, который может передать запрос в Visual Studio.
Управляемые объекты, глубоко вложенные или не размещенные вообще, могут вызывать GetGlobalService прямой доступ к глобальным службам.
Использование GetGlobalService
Иногда может потребоваться получить службу из окна инструментов или контейнера управления, который не был сайтам, или другой сайт был на сайте с поставщиком услуг, который не знает о нужной службе. Например, может потребоваться записать в журнал действий из элемента управления. Дополнительные сведения об этих и других сценариях см. в разделе "Практическое руководство. Устранение неполадок служб".
Большинство служб Visual Studio можно получить, вызвав статический GetGlobalService метод.
GetGlobalService использует кэшированный поставщик служб, инициализированный при первом запуске любого пакета VSPackage, производный от пакета. Необходимо гарантировать, что это условие выполнено или будет подготовлено к службе NULL.
К счастью, GetGlobalService работает правильно большую часть времени.
Если VSPackage предоставляет службу, известную только другому VSPackage, VSPackage запрашивает службу перед загрузкой VSPackage, предоставляющей службу.
Если окно инструментов создается с помощью VSPackage, vsPackage будет расположен перед созданием окна инструмента.
Если контейнер элементов управления размещается окном инструментов, созданным VSPackage, оно размещается перед созданием контейнера элементов управления.
Получение службы из окна инструмента или контейнера управления
Вставьте этот код в конструктор, окно инструментов или контейнер элементов управления:
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog; if (log == null) return;
Этот код получает службу SVsActivityLog и приводит ее к интерфейсу IVsActivityLog, который можно использовать для записи в журнал действий. Пример см. в разделе "Практическое руководство. Использование журнала действий".