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
Crie um projeto VSIX (File>New>Project Visual C#>Extensibility>VSIX Project).>
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.
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
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
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); . . . }
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.
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á".