Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um serviço é um contrato entre dois VSPackages. Um VSPackage fornece um conjunto específico de interfaces para outro VSPackage consumir. O 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.
O Visual Studio também fornece alguns serviços internos que não estão registrados. Os VSPackages podem substituir serviços embutidos ou outros fornecendo uma substituição de serviço. Somente uma substituição de serviço é permitida para qualquer serviço.
Os serviços não têm capacidade de descoberta. Portanto, você deve conhecer o SID (identificador de serviço) de um serviço que deseja consumir e deve saber quais interfaces ele fornece. A documentação de referência do serviço fornece essas informações.
Os VSPackages que fornecem serviços são chamados de provedores de serviços.
Os serviços 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 embutidos 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 dar 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 conversão (código gerenciado) para obter a interface desejada, por exemplo:
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 conceder ao VSPackage acesso aos serviços globais. Isso é chamado de "siting" do VSPackage.
Os VSPackages podem funcionar como provedores de serviços para os objetos que criam. Por exemplo, um formulário pode enviar uma solicitação de um serviço de cores para seu quadro, o que pode passar a solicitação para o Visual Studio.
Objetos gerenciados que estão profundamente aninhados ou não estão localizados podem chamar GetGlobalService para acesso direto aos serviços globais.
Usar GetGlobalService
Às vezes, talvez seja necessário obter um serviço de uma janela de ferramentas ou contêiner de controle que não tenha sido associado, ou então tenha sido associado a um provedor de serviços que desconhece 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 em 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 maior parte do tempo.
Se um VSPackage fornecer um serviço conhecido apenas para outro VSPackage, o VSPackage solicitando o serviço será colocado no site antes que o VSPackage que fornece o serviço seja carregado.
Se uma janela de ferramentas for criada por um VSPackage, o VSPackage será alocado antes da criação da janela de ferramentas.
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 esse 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.