Partager via


Principes Fondamentaux du Service

Un service est un contrat entre deux VSPackages. Un VSPackage fournit un ensemble spécifique d’interfaces pour qu’un autre VSPackage consomme. Visual Studio est lui-même une collection de VSPackages qui fournit des services à d’autres VSPackages.

Par exemple, vous pouvez utiliser le service SVsActivityLog pour obtenir une interface IVsActivityLog, que vous pouvez utiliser pour écrire dans le journal d’activité. Pour plus d’informations, consultez Guide pratique pour utiliser le journal d’activité.

Visual Studio fournit également certains services intégrés qui ne sont pas inscrits. Les VSPackages peuvent remplacer les services intégrés ou d'autres services en fournissant une surcharge de service. Une seule dérogation de service est autorisée pour chaque service.

Les services n’ont aucune découvrabilité. Par conséquent, vous devez connaître l’identificateur de service (SID) d’un service que vous souhaitez consommer, et vous devez connaître les interfaces qu’il fournit. La documentation de référence du service fournit ces informations.

  • Les VSPackages qui fournissent des services sont appelés fournisseurs de services.

  • Les services fournis à d’autres VSPackages sont appelés services globaux.

  • Les services disponibles uniquement pour le VSPackage qui les implémentent, ou pour tout objet qu’il crée, sont appelés services locaux.

  • Les services qui remplacent les services intégrés ou les services fournis par d’autres packages sont appelés remplacements de service.

  • Les services ou les remplacements de service sont chargés à la demande, c'est-à-dire que le fournisseur de services est chargé au moment où le service qu'il fournit est demandé par un autre VSPackage.

  • Pour prendre en charge le chargement à la demande, un fournisseur de services inscrit ses services globaux auprès de Visual Studio. Pour plus d’informations, consultez Guide pratique pour fournir un service.

  • Après avoir obtenu un service, utilisez QueryInterface (code non managé) ou cast (code managé) pour obtenir l’interface souhaitée, par exemple :

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • Le code managé fait référence à un service par son type, tandis que le code non managé fait référence à un service par son GUID.

  • Lorsque Visual Studio charge un VSPackage, il transmet un fournisseur de services au VSPackage pour donner à VSPackage l’accès à des services globaux. C’est ce qu’on appelle le « positionnement » du VSPackage.

  • Les VSPackages peuvent être des fournisseurs de services pour les objets qu’ils créent. Par exemple, un formulaire peut envoyer une demande d’un service de couleur à son cadre, ce qui peut transmettre la demande à Visual Studio.

  • Les objets managés qui sont profondément imbriqués, ou qui ne sont pas situés du tout, peuvent appeler GetGlobalService pour un accès direct aux services globaux.

Utiliser GetGlobalService

Parfois, vous devrez peut-être obtenir un service depuis une fenêtre d'outil ou un conteneur de contrôle qui n'a pas été implanté, ou qui a été implanté avec un fournisseur de services qui ne connaît pas le service que vous souhaitez obtenir. Par exemple, vous pourriez vouloir écrire dans le journal d’activité depuis un élément de contrôle. Pour plus d’informations sur ces scénarios et d’autres scénarios, consultez Guide pratique pour résoudre les problèmes liés aux services.

Vous pouvez obtenir la plupart des services Visual Studio en appelant la méthode statique GetGlobalService .

GetGlobalService s’appuie sur un fournisseur de services mis en cache qui est initialisé la première fois qu'un VSPackage dérivé de Package est positionné. Vous devez garantir que cette condition est remplie, ou être préparé pour un service nul.

Heureusement, GetGlobalService fonctionne correctement la plupart du temps.

  • Si un VSPackage fournit un service connu uniquement d'un autre VSPackage, le VSPackage demandant le service est positionné avant que le VSPackage fournisseur ne soit chargé.

  • Si une fenêtre d’outil est créée par un VSPackage, le VSPackage est sitené avant la création de la fenêtre outil.

  • Si un conteneur de contrôle est hébergé par une fenêtre d’outil créée par un VSPackage, vsPackage est sitené avant la création du conteneur de contrôle.

Pour obtenir un service à partir d’une fenêtre d’outil ou d’un conteneur de contrôle

  • Insérez ce code dans le constructeur, la fenêtre d'outils ou le conteneur de contrôle :

    IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
        if (log == null) return;
    

    Ce code obtient un service SVsActivityLog et le convertit en interface IVsActivityLog, qui peut être utilisée pour écrire dans le journal d’activité. Pour obtenir un exemple, consultez Comment : utiliser le journal d’activité.