Condividi tramite


Nozioni fondamentali sui servizi

Un servizio è un contratto tra due VSPackage. Un VSPackage fornisce un set specifico di interfacce per l'utilizzo di un altro VSPackage. Visual Studio è una raccolta di VSPackage che fornisce servizi ad altri pacchetti VSPackage.

Ad esempio, è possibile usare il servizio SVsActivityLog per ottenere un'interfaccia IVsActivityLog, che è possibile usare per scrivere nel log attività. Per altre informazioni, vedere Procedura: Usare il log attività.

Visual Studio offre anche alcuni servizi predefiniti che non sono registrati. I pacchetti VSPackage possono sostituire i servizi predefiniti o altri servizi fornendo un override del servizio. Per qualsiasi servizio è consentito un solo override del servizio.

I servizi non hanno individuabilità. Pertanto, è necessario conoscere l'identificatore del servizio (SID) di un servizio che si desidera utilizzare ed è necessario conoscere le interfacce fornite. La documentazione di riferimento per il servizio fornisce queste informazioni.

  • I pacchetti VSPackage che forniscono servizi sono denominati provider di servizi.

  • I servizi forniti ad altri pacchetti VSPackage sono denominati servizi globali.

  • I servizi disponibili solo per il VSPackage che li implementa o per qualsiasi oggetto creato vengono chiamati servizi locali.

  • I servizi che sostituiscono servizi o servizi predefiniti forniti da altri pacchetti, vengono chiamati sostituzioni del servizio.

  • I servizi, o gli override del servizio, vengono caricati su richiesta, ovvero il provider di servizi viene caricato quando il servizio fornito viene richiesto da un altro pacchetto VSPackage.

  • Per supportare il caricamento su richiesta, un provider di servizi registra i servizi globali con Visual Studio. Per altre informazioni, vedere Procedura: Fornire un servizio.

  • Dopo aver ottenuto un servizio, usare QueryInterface (codice non gestito) o eseguire il cast (codice gestito) per ottenere l'interfaccia desiderata, ad esempio:

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • Il codice gestito fa riferimento a un servizio in base al tipo, mentre il codice non gestito fa riferimento a un servizio in base al relativo GUID.

  • Quando Visual Studio carica un VSPackage, passa un provider di servizi al VSPackage per concedere al VSPackage l'accesso ai servizi globali. Questo comportamento viene definito "siting" del VSPackage.

  • I pacchetti VSPackage possono essere provider di servizi per gli oggetti creati. Ad esempio, un modulo potrebbe inviare una richiesta di un servizio colori al relativo frame, che potrebbe passare la richiesta a Visual Studio.

  • Gli oggetti gestiti annidati o non inseriti in un sito possono richiedere GetGlobalService l'accesso diretto ai servizi globali.

Usare GetGlobalService

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 . Per altre informazioni su questi e altri scenari, vedere Procedura: Risolvere i problemi dei servizi.

È possibile ottenere la maggior parte dei servizi di Visual Studio chiamando il metodo statico GetGlobalService .

GetGlobalService si basa su un provider di servizi memorizzato nella cache che viene inizializzato la prima volta che viene localizzato qualsiasi pacchetto VSPackage derivato da Package. È necessario garantire che questa condizione venga soddisfatta oppure essere preparata per un servizio Null.

Fortunatamente, GetGlobalService funziona correttamente la maggior parte del tempo.

  • Se un VSPackage fornisce un servizio noto solo a un altro VSPackage, il VSPackage che richiede il servizio viene archiviato nel sito prima del caricamento del pacchetto VSPackage che fornisce il servizio.

  • Se una finestra degli strumenti viene creata da un VSPackage, il pacchetto VSPackage viene sito prima della creazione della finestra degli strumenti.

  • Se un contenitore di controlli è ospitato da una finestra degli strumenti creata da un VSPackage, il pacchetto VSPackage viene archiviato prima della creazione del contenitore di controlli.

Per ottenere un servizio dall'interno di una finestra degli strumenti o da un contenitore di controlli

  • Inserire questo codice nel contenitore del costruttore, della finestra degli strumenti o del controllo:

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

    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à.