Compartilhar via


Prestar um serviço

Um VSPackage pode fornecer serviços que outros VSPackages podem usar. Para fornecer um serviço, um VSPackage deve registrar o serviço com o Visual Studio e adicionar o serviço.

A Package classe implementa ambos IServiceProvider e IServiceContainer. IServiceContainer Contém métodos de retorno de chamada que fornecem serviços sob demanda.

Para obter mais informações sobre serviços, consulte Princípios básicos de serviço .

Observação

Quando um VSPackage está prestes a ser descarregado, o Visual Studio aguarda até que todas as solicitações de serviços que um VSPackage fornece tenham sido entregues. Não permite novas solicitações para esses serviços. Você não deve chamar explicitamente o RevokeService método para revogar um serviço ao descarregar.

Implementar um serviço

  1. Crie um projeto VSIX (File>New>Project Visual C#>Extensibility>VSIX Project).>

  2. Adicione um VSPackage ao projeto. Selecione o nó do projeto no Gerenciador de Soluções e clique em Adicionar>Novo item>Visual C# Items>Extensibility>Visual Studio Package.

  3. Para implementar um serviço, você precisa criar três tipos:

    • Uma interface que descreve o serviço. Muitas dessas interfaces estão vazias, ou seja, não têm métodos.

    • Uma interface que descreve a interface de serviço. Essa interface inclui os métodos a serem implementados.

    • Uma classe que implementa o serviço e a interface de serviço.

      O exemplo a seguir mostra uma implementação básica dos três tipos. O construtor da classe de serviço deve definir o provedor de serviços.

    public class MyService : SMyService, IMyService
    {
        private Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider;
        private string myString;
        public MyService(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp)
        {
            Trace.WriteLine(
                   "Constructing a new instance of MyService");
            serviceProvider = sp;
        }
        public void Hello()
        {
            myString = "hello";
        }
        public string Goodbye()
        {
           return "goodbye";
        }
    }
    public interface SMyService
    {
    }
    public interface IMyService
    {
        void Hello();
        string Goodbye();
    }
    
    

Cadastrar um serviço

  1. Para registrar um serviço, adicione o ao VSPackage que fornece o ProvideServiceAttribute serviço. Este é um exemplo:

    [ProvideService(typeof(SMyService))]
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [Guid(VSPackage1.PackageGuidString)]
    public sealed class VSPackage1 : Package
    {. . . }
    

    Esse atributo se registra com o SMyService Visual Studio.

    Observação

    Para registrar um serviço que substitui outro serviço com o mesmo nome, use o ProvideServiceOverrideAttribute. Observe que apenas uma substituição de um serviço é permitida.

Adicionar um serviço

  1. No inicializador VSPackage, adicione o serviço e adicione um método de retorno de chamada para criar os serviços. Aqui está a alteração a ser feita no Initialize método:

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. Implemente o método de retorno de chamada, que deve criar e retornar o serviço, ou null se ele não puder ser criado.

    private object CreateService(IServiceContainer container, Type serviceType)
    {
        if (typeof(SMyService) == serviceType)
            return new MyService(this);
        return null;
    }
    

    Observação

    Visual Studio pode rejeitar uma solicitação para fornecer um serviço. Ele faz isso se outro VSPackage já fornece o serviço.

  3. Agora você pode obter o serviço e usar seus métodos. O exemplo abaixo mostra o uso do serviço no inicializador, mas você pode obter o serviço em qualquer lugar que deseje usar o serviço.

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    
        MyService myService = (MyService) this.GetService(typeof(SMyService));
        myService.Hello();
        string helloString = myService.Goodbye();
    
        base.Initialize();
    }
    

    O valor de helloString deve ser "Olá".