Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Служба — это контракт между двумя VSPackages. Один 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, производного от Пакета. Необходимо гарантировать выполнение этого условия, иначе будьте готовы к отсутствию службы.
К счастью, GetGlobalService работает правильно большую часть времени.
Если VSPackage запрашивает службу, известную только другому VSPackage, то VSPackage с запросом располагается перед загрузкой VSPackage, предоставляющего службу.
Если окно инструментов создается с помощью VSPackage, vsPackage будет расположен перед созданием окна инструмента.
Если контейнер элементов управления размещен в окне инструментов, созданном VSPackage, то сначала размещается VSPackage, а затем создается контейнер элементов управления.
Получение службы из окна инструментов или контейнера управления
Вставьте этот код в конструктор, окно инструментов или контейнер элементов управления:
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog; if (log == null) return;
Этот код получает службу SVsActivityLog и приводит ее к интерфейсу IVsActivityLog, который можно использовать для записи в журнал действий. Пример см. в разделе "Практическое руководство. Использование журнала действий".