Partager via


Fournir un service

Un VSPackage peut fournir des services que d’autres VSPackages peuvent utiliser. Pour fournir un service, un VSPackage doit inscrire le service auprès de Visual Studio et ajouter le service.

La Package classe implémente à la fois IServiceProvider et IServiceContainer. IServiceContainer contient des méthodes de rappel qui fournissent des services à la demande.

Pour plus d’informations sur les services, consultez Services essentiels .

Remarque

Lorsqu’un VSPackage est sur le point d’être déchargé, Visual Studio attend que toutes les demandes de services fournis par un VSPackage aient été remis. Elle n’autorise pas les nouvelles demandes pour ces services. Vous ne devez pas appeler explicitement la RevokeService méthode pour révoquer un service lors du déchargement.

Implémenter un service

  1. Créez un projet VSIX (Fichier>nouveau>projet>Visual C#>Extensibilité>VSIX Project).

  2. Ajoutez un VSPackage au projet. Sélectionnez le nœud du projet dans l’Explorateur de solutions, puis cliquez sur Ajouter un>nouvel élément>Visual C# Élément>extensibility>Visual Studio Package.

  3. Pour implémenter un service, vous devez créer trois types :

    • Interface qui décrit le service. La plupart de ces interfaces sont vides, c’est-à-dire qu’elles n’ont aucune méthode.

    • Interface qui décrit l’interface de service. Cette interface inclut les méthodes à implémenter.

    • Classe qui implémente le service et l’interface de service.

      L’exemple suivant montre une implémentation de base des trois types. Le constructeur de la classe de service doit définir le fournisseur de services.

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

Inscrire un service

  1. Pour inscrire un service, ajoutez-le ProvideServiceAttribute au VSPackage qui fournit le service. Voici un exemple :

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

    Cet attribut s’inscrit SMyService auprès de Visual Studio.

    Remarque

    Pour inscrire un service qui remplace un autre service portant le même nom, utilisez le ProvideServiceOverrideAttribute. Notez qu’un seul remplacement d’un service est autorisé.

Ajouter un service

  1. Dans l’initialiseur VSPackage, ajoutez le service et ajoutez une méthode de rappel pour créer les services. Voici la modification à apporter à la Initialize méthode :

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. Implémentez la méthode de rappel, qui doit créer et retourner le service, ou null si elle ne peut pas être créée.

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

    Remarque

    Visual Studio peut rejeter une demande de fourniture d’un service. Cela se produit si un autre VSPackage fournit déjà le service.

  3. Vous pouvez maintenant obtenir le service et utiliser ses méthodes. L’exemple ci-dessous montre l’utilisation du service dans l’initialiseur, mais vous pouvez obtenir le service partout où vous souhaitez utiliser le service.

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

    La valeur de helloString doit être « Hello ».