Proporcionar un servicio

Un VSPackage puede proporcionar servicios que otros VSPackages pueden usar. Para proporcionar un servicio, un VSPackage debe registrar el servicio con Visual Studio y agregar el servicio.

La Package clase implementa y IServiceProviderIServiceContainer. IServiceContainer contiene métodos de devolución de llamada que proporcionan servicios a petición.

Para obtener más información sobre los servicios, consulte Service essentials .

Nota:

Cuando un VSPackage está a punto de descargarse, Visual Studio espera hasta que se hayan entregado todas las solicitudes de servicios que proporciona un VSPackage. No permite nuevas solicitudes para estos servicios. No debe llamar explícitamente al RevokeService método para revocar un servicio al descargar.

Implementación de un servicio

  1. Cree un proyecto VSIX (Archivo>nuevo>proyecto>visual C#>Extensibilidad>vsix Project).

  2. Agregue un VSPackage al proyecto. Seleccione el nodo del proyecto en el Explorador de soluciones y haga clic en Agregar>nuevo elemento>Visual C# Elementos>extensibilidad>paquete de Visual Studio.

  3. Para implementar un servicio, debe crear tres tipos:

    • Interfaz que describe el servicio. Muchas de estas interfaces están vacías, es decir, no tienen métodos.

    • Interfaz que describe la interfaz de servicio. Esta interfaz incluye los métodos que se van a implementar.

    • Clase que implementa tanto el servicio como la interfaz de servicio.

      En el ejemplo siguiente se muestra una implementación básica de los tres tipos. El constructor de la clase de servicio debe establecer el proveedor de servicios.

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

Registro de un servicio

  1. Para registrar un servicio, agregue al ProvideServiceAttribute VSPackage que proporciona el servicio. Este es un ejemplo:

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

    Este atributo se registra SMyService con Visual Studio.

    Nota:

    Para registrar un servicio que reemplace otro servicio con el mismo nombre, use .ProvideServiceOverrideAttribute Tenga en cuenta que solo se permite una invalidación de un servicio.

Agregar un servicio

  1. En el inicializador VSPackage, agregue el servicio y agregue un método de devolución de llamada para crear los servicios. Este es el cambio que se va a realizar en el Initialize método :

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. Implemente el método de devolución de llamada, que debe crear y devolver el servicio, o null si no se puede crear.

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

    Nota:

    Visual Studio puede rechazar una solicitud para proporcionar un servicio. Lo hace si otro VSPackage ya proporciona el servicio.

  3. Ahora puede obtener el servicio y usar sus métodos. En el ejemplo siguiente se muestra el uso del servicio en el inicializador, pero puede obtener el servicio en cualquier lugar en el que quiera usar el servicio.

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

    El valor de helloString debe ser "Hello".