Получение службы
Для доступа к различным функциям часто требуется получить службы Visual Studio. Как правило, служба Visual Studio предоставляет один или несколько интерфейсов, которые можно использовать. Большинство служб можно получить из VSPackage.
Любой VSPackage, производный от Package и который был правильно сайтирован, может запрашивать любую глобальную службу. Package
Так как класс реализуетIServiceProvider, любой VSPackage, производный от Package
этого, также является поставщиком услуг.
При загрузке PackageVisual Studio объект IServiceProvider передается методу SetSite во время инициализации. Это называется сидячей VSPackage. Класс Package
упаковывает этот поставщик услуг и предоставляет GetService метод получения служб.
Получение службы из инициализированного VSPackage
Каждое расширение Visual Studio начинается с проекта развертывания VSIX, который будет содержать ресурсы расширения. Создайте проект VISUAL Studio VSIX с именем
GetServiceExtension
. Шаблон проекта VSIX можно найти в диалоговом окне "Новый проект ", выполнив поиск vsix.Теперь добавьте пользовательский шаблон элемента команд с именем GetServiceCommand. В диалоговом окне "Добавление нового элемента" перейдите в Visual C#>Extensibility и выберите "Пользовательская команда". В поле "Имя" в нижней части окна измените имя файла команды на GetServiceCommand.cs. Дополнительные сведения о том, как создать пользовательскую команду, создайте расширение с помощью команды меню
В GetServiceCommand.cs удалите текст
MenuItemCommand
метода и добавьте следующий код:IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog; if (activityLog == null) return; System.Windows.Forms.MessageBox.Show("Found the activity log service.");
Этот код получает службу SVsActivityLog и приводит ее к IVsActivityLog интерфейсу, который можно использовать для записи в журнал действий. Пример см. в разделе "Практическое руководство. Использование журнала действий".
Выполните сборку решения и запустите отладку. Откроется экспериментальный экземпляр.
В меню "Сервис" экспериментального экземпляра найдите кнопку Invoke GetServiceCommand. При нажатии этой кнопки появится окно сообщения, которое говорит, что служба журнала действий найдена.
Получение службы из окна инструментов или контейнера управления
Иногда может потребоваться получить службу из окна инструментов или контейнера управления, который не был сайтам, или другой сайт был на сайте с поставщиком услуг, который не знает о нужной службе. Например, может потребоваться записать в журнал действий из элемента управления.
GetGlobalService Статический метод использует кэшированный поставщик служб, который инициализирован при первом запуске любого производного VSPackage от Package сайта.
Так как конструктор VSPackage вызывается перед сайтом VSPackage, глобальные службы обычно недоступны в конструкторе VSPackage. См . инструкции. Устранение неполадок служб для обходного решения.
Ниже приведен пример способа получения службы в окне инструментов или другом элементе, отличном от VSPackage.
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;
Получение службы из объекта DTE
Вы также можете получить службы из DTEClass объекта. Однако необходимо получить объект DTE в качестве службы из VSPackage или путем вызова статического GetGlobalService метода.
Объект DTE реализует IServiceProvider, который можно использовать для запроса к службе с помощью GetService.
Вот как получить службу из объекта DTE.
// Start with the DTE object, for example:
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));
ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log != null)
{
System.Windows.Forms.MessageBox.Show("Found the activity log service.");
}
}