Partilhar via


Conceitos básicos do serviço

Um serviço é um contrato entre dois VSPackages. Um VSPackage fornece um conjunto específico de interfaces para outro VSPackage consumir. Visual Studio é uma coleção de VSPackages que fornece serviços para outros VSPackages.

Por exemplo, você pode usar o serviço SVsActivityLog para obter uma interface IVsActivityLog, que pode ser usada para gravar no log de atividades. Para obter mais informações, consulte Como usar o log de atividades.

Visual Studio também fornece alguns serviços internos que não estão registrados. Os VSPackages podem substituir serviços internos ou outros fornecendo uma substituição de serviço. Apenas uma substituição de serviço é permitida para qualquer serviço.

Os serviços não têm capacidade de descoberta. Portanto, você deve saber o identificador de serviço (SID) de um serviço que você deseja consumir e você deve saber quais interfaces ele fornece. A documentação de referência para o serviço fornece essas informações.

  • Os VSPackages que fornecem serviços são chamados de provedores de serviços.

  • Os serviços que são fornecidos a outros VSPackages são chamados de serviços globais.

  • Os serviços que estão disponíveis apenas para o VSPackage que os implementa, ou para qualquer objeto que ele cria, são chamados de serviços locais.

  • Os serviços que substituem serviços internos ou serviços fornecidos por outros pacotes são chamados de substituições de serviço.

  • Os serviços, ou substituições de serviço, são carregados sob demanda, ou seja, o provedor de serviços é carregado quando o serviço que ele fornece é solicitado por outro VSPackage.

  • Para oferecer suporte ao carregamento sob demanda, um provedor de serviços registra seus serviços globais com o Visual Studio. Para obter mais informações, consulte Como: Fornecer um serviço.

  • Depois de obter um serviço, use QueryInterface (código não gerenciado) ou transmissão (código gerenciado) para obter a interface desejada, por exemplo:

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • O código gerenciado refere-se a um serviço por seu tipo, enquanto o código não gerenciado refere-se a um serviço por seu GUID.

  • Quando o Visual Studio carrega um VSPackage, ele passa um provedor de serviços para o VSPackage para dar ao VSPackage acesso a serviços globais. Isso é conhecido como "localizar" o VSPackage.

  • Os VSPackages podem ser provedores de serviços para os objetos que criam. Por exemplo, um formulário pode enviar uma solicitação para um serviço de cores para seu quadro, que pode passar a solicitação para o Visual Studio.

  • Objetos gerenciados que estão profundamente aninhados ou não estão localizados podem exigir GetGlobalService acesso direto a serviços globais.

Usar GetGlobalService

À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. Para obter mais informações sobre esses e outros cenários, consulte Como: Solucionar problemas de serviços.

Você pode obter a maioria dos serviços do Visual Studio chamando o método estático GetGlobalService .

GetGlobalService depende de um provedor de serviços armazenado em cache que é inicializado na primeira vez que qualquer VSPackage derivado do pacote é localizado. Você deve garantir que essa condição seja atendida, ou então estar preparado para um serviço nulo.

Felizmente, GetGlobalService funciona corretamente na maioria das vezes.

  • Se um VSPackage fornece um serviço conhecido apenas por outro VSPackage, o VSPackage solicitando o serviço é localizado antes que o VSPackage que fornece o serviço seja carregado.

  • Se uma janela de ferramenta for criada por um VSPackage, o VSPackage será localizado antes da janela de ferramenta ser criada.

  • Se um contêiner de controle for hospedado por uma janela de ferramenta criada por um VSPackage, o VSPackage será localizado antes que o contêiner de controle seja criado.

Para obter um serviço de dentro de uma janela de ferramenta ou contêiner de controle

  • Insira este código no construtor, na janela da ferramenta ou no contêiner de controle:

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

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