Éléments 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 un remplacement de service. Un seul remplacement de service est autorisé pour n’importe quel service.
Les services n’ont aucune détectabilité. 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, autrement dit, le fournisseur de services est chargé lorsque le service fourni 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 :
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 « siting » le 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 sitenés du tout, peuvent appeler GetGlobalService un accès direct aux services globaux.
Utiliser GetGlobalService
Parfois, vous devrez peut-être obtenir un service à partir d’une fenêtre d’outil ou d’un conteneur de contrôle qui n’a pas été sitené ou qui a été sitené avec un fournisseur de services qui ne connaît pas le service souhaité. Par exemple, vous pouvez écrire dans le journal d’activité à partir d’un 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 que vsPackage dérivé du package est sitené. Vous devez garantir que cette condition est remplie, ou être préparée pour un service Null.
Heureusement, GetGlobalService fonctionne correctement la plupart du temps.
Si un VSPackage fournit un service connu uniquement pour un autre VSPackage, le VSPackage demandant le service est sitené avant le chargement du service par VSPackage.
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 outil 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é.