Obtenha um serviço

Você geralmente precisa obter serviços do Visual Studio para acessar recursos diferentes. Em geral, um serviço do Visual Studio fornece uma ou mais interfaces que você pode usar. Você pode obter a maioria dos serviços de um VSPackage.

Qualquer VSPackage que derive de Package e que tenha sido corretamente localizado pode solicitar qualquer serviço global. Como a classe implementa PackageIServiceProvider, qualquer VSPackage que deriva de também é um provedor de Package serviços.

Quando o Visual Studio carrega um , ele passa um PackageIServiceProvider objeto para o método durante a SetSite inicialização. Isso é chamado de localização do VSPackage. A Package classe encapsula esse provedor de serviços e fornece o GetService método para obter serviços.

Obtendo um serviço de um VSPackage inicializado

  1. Cada extensão do Visual Studio começa com um projeto de implantação VSIX, que conterá os ativos de extensão. Crie um projeto VSIX do Visual Studio chamado GetServiceExtension. Você pode encontrar o modelo de projeto VSIX na caixa de diálogo Novo projeto pesquisando por "vsix".

  2. Agora adicione um modelo de item de comando personalizado chamado GetServiceCommand. Na caixa de diálogo Adicionar Novo Item, vá para Visual C#>Extensibility e selecione Comando Personalizado. No campo Nome na parte inferior da janela, altere o nome do arquivo de comando para GetServiceCommand.cs. Para obter mais informações sobre como criar um comando personalizado, Criar uma extensão com um comando de menu

  3. Em GetServiceCommand.cs, remova o MenuItemCommand corpo do método e adicione o seguinte código:

    IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (activityLog == null) return;
    System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    
    

    Esse código obtém um serviço SVsActivityLog e o converte em uma IVsActivityLog interface, que pode ser usada para gravar no log de atividades. Para obter um exemplo, consulte Como: Usar o log de atividades.

  4. Compile o projeto e comece a depuração. A instância experimental é exibida.

  5. No menu Ferramentas da instância experimental, localize o botão Invoke GetServiceCommand. Ao clicar nesse botão, você verá uma caixa de mensagem que diz Encontrou o serviço de log de atividades.

Obtendo um serviço de uma janela de ferramenta ou contêiner de controle

Às vezes, talvez seja necessário obter um serviço de uma janela de ferramenta ou contêiner de controle que não tenha sido localizado, ou então tenha sido localizado com um provedor de serviços que não sabe sobre o serviço desejado. Por exemplo, talvez você queira gravar no log de atividades de dentro de um controle.

O método estático GetGlobalService depende de um provedor de serviços armazenado em cache que é inicializado na primeira vez que qualquer VSPackage derivado de Package é localizado.

Como o construtor VSPackage é chamado antes que o VSPackage seja localizado, os serviços globais normalmente não estão disponíveis no construtor VSPackage. Consulte Como: Solucionar problemas de serviços para obter uma solução alternativa.

Aqui está um exemplo da maneira de obter um serviço em uma janela de ferramenta ou outro elemento não-VSPackage.

IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

Obtendo um serviço do objeto DTE

Você também pode obter serviços do DTEClass objeto. No entanto, você deve obter o objeto DTE como um serviço de um VSPackage ou chamando o método estático GetGlobalService .

O objeto DTE implementa IServiceProvider, que você pode usar para consultar um serviço usando GetService.

Veja como obter um serviço do objeto 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.");
    }
}