Condividi tramite


Ottenere un servizio

Spesso è necessario ottenere i servizi di Visual Studio per accedere a funzionalità diverse. In generale, un servizio di Visual Studio fornisce una o più interfacce che è possibile usare. È possibile ottenere la maggior parte dei servizi da un pacchetto VSPackage.

Qualsiasi VSPackage che deriva da Package e che è stato correttamente memorizzato nel sito può richiedere qualsiasi servizio globale. Poiché la Package classe implementa IServiceProvider, qualsiasi VSPackage che deriva da Package è anche un provider di servizi.

Quando Visual Studio carica un Packageoggetto , passa un IServiceProvider oggetto al metodo durante l'inizializzazione SetSite . Questa operazione è denominata siting del VSPackage. La classe esegue il wrapping di Package questo provider di servizi e fornisce il GetService metodo per ottenere i servizi.

Recupero di un servizio da un VSPackage inizializzato

  1. Ogni estensione di Visual Studio inizia con un progetto di distribuzione VSIX, che conterrà gli asset di estensione. Creare un progetto VSIX di Visual Studio denominato GetServiceExtension. È possibile trovare il modello di progetto VSIX nella finestra di dialogo Nuovo progetto cercando "vsix".

  2. Aggiungere ora un modello di elemento di comando personalizzato denominato GetServiceCommand. Nella finestra di dialogo Aggiungi nuovo elemento passare a Visual C#>Estendibilità e selezionare Comando personalizzato. Nel campo Nome nella parte inferiore della finestra modificare il nome del file di comando in GetServiceCommand.cs. Per altre informazioni su come creare un comando personalizzato, creare un'estensione con un comando di menu

  3. In GetServiceCommand.cs rimuovere il corpo del MenuItemCommand metodo e aggiungere il codice seguente:

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

    Questo codice ottiene un servizio SVsActivityLog ed esegue il cast a un'interfaccia IVsActivityLog , che può essere usata per scrivere nel log attività. Per un esempio, vedere Procedura: Usare il log attività.

  4. Compilare il progetto e avviare il debug. Viene visualizzata l'istanza sperimentale.

  5. Nel menu Strumenti dell'istanza sperimentale trovare il pulsante Invoke GetServiceCommand. Quando si fa clic su questo pulsante, verrà visualizzata una finestra di messaggio che indica Trovato il servizio del log attività.

Recupero di un servizio da una finestra degli strumenti o da un contenitore di controlli

A volte potrebbe essere necessario ottenere un servizio da una finestra degli strumenti o da un contenitore di controllo che non è stato sito oppure è stato sito con un provider di servizi che non conosce il servizio desiderato. Ad esempio, è possibile scrivere nel log attività dall'interno di un controllo .

Il metodo statico GetGlobalService si basa su un provider di servizi memorizzato nella cache che viene inizializzato la prima volta che viene localizzato un vsPackage derivato da Package .

Poiché il costruttore VSPackage viene chiamato prima che il pacchetto VSPackage sia presente nel sito, i servizi globali in genere non sono disponibili all'interno del costruttore VSPackage. Vedere Procedura: Risolvere i problemi relativi ai servizi per una soluzione alternativa.

Ecco un esempio del modo per ottenere un servizio in una finestra degli strumenti o in un altro elemento non VSPackage.

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

Recupero di un servizio dall'oggetto DTE

È anche possibile ottenere servizi dall'oggetto DTEClass . Tuttavia, è necessario ottenere l'oggetto DTE come servizio da un VSPackage o chiamando il metodo statico GetGlobalService .

L'oggetto DTE implementa IServiceProvider, che è possibile usare per eseguire query per un servizio tramite GetService.

Ecco come ottenere un servizio dall'oggetto 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.");
    }
}