Fornire un servizio

Un VSPackage può fornire servizi che possono essere usati da altri pacchetti VSPackage. Per fornire un servizio, un pacchetto VSPackage deve registrare il servizio con Visual Studio e aggiungere il servizio.

La Package classe implementa sia IServiceProvider che IServiceContainer. IServiceContainer contiene metodi di callback che forniscono servizi su richiesta.

Per altre informazioni sui servizi, vedere Service Essentials .

Nota

Quando un VSPackage sta per essere scaricato, Visual Studio attende fino a quando non vengono recapitate tutte le richieste di servizi forniti da un VSPackage. Non consente nuove richieste per questi servizi. Non è consigliabile chiamare in modo esplicito il RevokeService metodo per revocare un servizio durante lo scaricamento.

Implementare un servizio

  1. Creare un progetto VSIX (File>New>Project>Visual C#>Extensibility>VSIX Project).

  2. Aggiungere un PACCHETTO VSPackage al progetto. Selezionare il nodo del progetto nel Esplora soluzioni e fare clic su Aggiungi>nuovo elemento Visual C# Items>Extensibility Visual Studio Package (Aggiungi nuovo elemento>Visual C# Extensibility>Visual Studio Package).

  3. Per implementare un servizio, è necessario creare tre tipi:

    • Interfaccia che descrive il servizio. Molte di queste interfacce sono vuote, ovvero non hanno metodi.

    • Interfaccia che descrive l'interfaccia del servizio. Questa interfaccia include i metodi da implementare.

    • Classe che implementa sia il servizio che l'interfaccia del servizio.

      Nell'esempio seguente viene illustrata un'implementazione di base dei tre tipi. Il costruttore della classe del servizio deve impostare il provider di servizi.

    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();
    }
    
    

Registrare un servizio

  1. Per registrare un servizio, aggiungere a ProvideServiceAttribute VSPackage che fornisce il servizio. Ecco un esempio:

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

    Questo attributo viene registrato SMyService con Visual Studio.

    Nota

    Per registrare un servizio che sostituisce un altro servizio con lo stesso nome, usare .ProvideServiceOverrideAttribute Si noti che è consentito un solo override di un servizio.

Aggiungere un servizio

  1. Nell'inizializzatore VSPackage aggiungere il servizio e aggiungere un metodo di callback per creare i servizi. Ecco la modifica da apportare al Initialize metodo :

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. Implementare il metodo di callback, che deve creare e restituire il servizio oppure null se non può essere creato.

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

    Nota

    Visual Studio può rifiutare una richiesta di fornire un servizio. In questo modo, se un altro VSPackage fornisce già il servizio.

  3. È ora possibile ottenere il servizio e usare i relativi metodi. L'esempio seguente illustra l'uso del servizio nell'inizializzatore, ma è possibile ottenere il servizio ovunque si voglia usare il servizio.

    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();
    }
    

    Il valore di helloString deve essere "Hello".