Obtenir un service

Vous devez souvent obtenir des services Visual Studio pour accéder à différentes fonctionnalités. En général, un service Visual Studio fournit une ou plusieurs interfaces que vous pouvez utiliser. Vous pouvez obtenir la plupart des services à partir d’un VSPackage.

Tout VSPackage dérivé et Package qui a été correctement sitené peut demander n’importe quel service global. Étant donné que la Package classe implémente IServiceProvider, tout VSPackage dérivé d’est Package également un fournisseur de services.

Lorsque Visual Studio charge un Packageobjet, il transmet un IServiceProvider objet à la méthode pendant l’initialisation SetSite . C’est ce que l’on appelle la mise en place du VSPackage. La Package classe encapsule ce fournisseur de services et fournit la GetService méthode d’obtention de services.

Obtention d’un service à partir d’un VSPackage initialisé

  1. Chaque extension Visual Studio commence par un projet de déploiement VSIX, qui contiendra les ressources d’extension. Créez un projet VSIX Visual Studio nommé GetServiceExtension. Vous trouverez le modèle de projet VSIX dans la boîte de dialogue Nouveau projet en recherchant « vsix ».

  2. Ajoutez maintenant un modèle d’élément de commande personnalisé nommé GetServiceCommand. Dans la boîte de dialogue Ajouter un nouvel élément, accédez à Visual C#>Extensibilité et sélectionnez Commande personnalisée. Dans le champ Nom en bas de la fenêtre, remplacez le nom du fichier de commande par GetServiceCommand.cs. Pour plus d’informations sur la création d’une commande personnalisée, créez une extension avec une commande de menu

  3. Dans GetServiceCommand.cs, supprimez le corps de la MenuItemCommand méthode et ajoutez le code suivant :

    IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (activityLog == null) return;
    System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    
    

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

  4. Générez le projet et commencez le débogage. L’instance expérimentale s’affiche.

  5. Dans le menu Outils de l’instance expérimentale, recherchez le bouton Invoke GetServiceCommand . Lorsque vous cliquez sur ce bouton, vous devriez voir une boîte de message indiquant Que le service du journal d’activité a été trouvé.

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

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.

La méthode statique GetGlobalService s’appuie sur un fournisseur de services mis en cache qui est initialisé la première fois que tout VSPackage dérivé de Package celui-ci est sitené.

Étant donné que le constructeur VSPackage est appelé avant le site de VSPackage, les services globaux ne sont généralement pas disponibles à partir du constructeur VSPackage. Découvrez comment : résoudre les problèmes liés aux services pour une solution de contournement.

Voici un exemple de la façon d’obtenir un service dans une fenêtre d’outil ou un autre élément non-VSPackage.

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

Obtention d’un service à partir de l’objet DTE

Vous pouvez également obtenir des services à partir d’un DTEClass objet. Toutefois, vous devez obtenir l’objet DTE en tant que service à partir d’un VSPackage ou en appelant la méthode statique GetGlobalService .

L’objet DTE implémente IServiceProvider, que vous pouvez utiliser pour interroger un service à l’aide GetServicede .

Voici comment obtenir un service à partir de l’objet DTE.

// Start with the DTE object, for example: 
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));

ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
    IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (log != null)
    {
        System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    }
}