Comment : fournir un ServiceHow to: Provide a Service

Un VSPackage peut fournir des services qui permet d’autres packages VS.A VSPackage can provide services that other VSPackages can use. Pour fournir un service, un VSPackage doit inscrire le service avec Visual Studio et ajoutez le service.To provide a service, a VSPackage must register the service with Visual Studio and add the service.

Le Package classe implémente à la fois IServiceProvider et IServiceContainer.The Package class implements both IServiceProvider and IServiceContainer. IServiceContainer contient des méthodes de rappel qui fournissent des services à la demande.IServiceContainer contains callback methods that provide services on demand.

Pour plus d’informations sur les services, consultez Service Essentials .For more information about services, see Service Essentials .

Note

Quand un VSPackage va être déchargé, Visual Studio attend jusqu'à ce que toutes les demandes pour les services fournis par un VSPackage ont été remis.When a VSPackage is about to be unloaded, Visual Studio waits until all requests for services that a VSPackage provides have been delivered. Il n’autorise pas les nouvelles demandes de ces services.It does not allow new requests for these services. Vous ne devez pas appeler explicitement la RevokeService méthode révoquer un service lors du déchargement.You should not explicitly call the RevokeService method to revoke a service when unloading.

Implémentation d’un serviceImplementing a service

  1. Créez un projet VSIX (fichier > Nouveau > projet > c# > extensibilité > projet VSIX).Create a VSIX project (File > New > Project > Visual C# > Extensibility > VSIX Project).

  2. Ajouter un VSPackage au projet.Add a VSPackage to the project. Sélectionnez le nœud de projet dans le l’Explorateur de solutions et cliquez sur Ajouter > nouvel élément > éléments Visual c# > extensibilité > Package Visual Studio.Select the project node in the Solution Explorer and click Add > New item > Visual C# Items > Extensibility > Visual Studio Package.

  3. Pour implémenter un service, vous devez créer trois types :To implement a service, you need to create three types:

    • Interface qui décrit le service.An interface that describes the service. La plupart de ces interfaces sont vides, autrement dit, elles n’ont aucuns méthodes.Many of these interfaces are empty, that is, they have no methods.

    • Interface qui décrit l’interface de service.An interface that describes the service interface. Cette interface comprend les méthodes à implémenter.This interface includes the methods to be implemented.

    • Une classe qui implémente le service et l’interface de service.A class that implements both the service and the service interface.

      L’exemple suivant montre une implémentation des trois types de base.The following example shows a basic implementation of the three types. Le constructeur de la classe de service doit définir le fournisseur de services.The constructor of the service class must set the service provider.

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

L’inscription d’un serviceRegistering a service

  1. Pour inscrire un service, ajoutez le ProvideServiceAttribute pour le VSPackage qui fournit le service.To register a service, add the ProvideServiceAttribute to the VSPackage that provides the service. Voici un exemple :Here is an example:

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

    Cet attribut enregistre SMyService avec Visual Studio.This attribute registers SMyService with Visual Studio.

    Note

    Pour inscrire un service qui remplace un autre service portant le même nom, utilisez le ProvideServiceOverrideAttribute.To register a service that replaces another service with the same name, use the ProvideServiceOverrideAttribute. Notez que seul remplacement d’un service est autorisé.Note that only one override of a service is allowed.

Ajout d’un ServiceAdding a Service

  1. Dans l’initialiseur de VSPackage, ajoutez le service et ajouter une méthode de rappel pour créer les services.In the VSPackage initializer, add the service and add a callback method to create the services. Voici la modification à apporter à la Initialize méthode :Here is the change to make to the Initialize method:

    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 s’il ne peut pas être créé.Implement the callback method, which should create and return the service, or null if it cannot be created.

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

    Note

    Visual Studio peut rejeter une demande de fournir un service.Visual Studio can reject a request to provide a service. Il le fait si un autre VSPackage fournit déjà le service.It does so if another VSPackage already provides the service.

  3. Vous pouvez désormais obtenir le service et utiliser ses méthodes.Now you can get the service and use its methods. L’exemple ci-dessous illustre l’utilisation du service dans l’initialiseur, mais vous pouvez obtenir le service n’importe où que vous souhaitez utiliser le service.The example below shows using the service in the initializer, but you can get the service anywhere you want to use the 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 ».The value of helloString should be "Hello".

Voir aussiSee Also

Comment : obtenir un Service How to: Get a Service
À l’aide et fournir des Services Using and Providing Services
Éléments fondamentaux du serviceService Essentials