Freigeben über


Dienstgrundlagen

Ein Dienst ist ein Vertrag zwischen zwei VSPackages. One VSPackage bietet einen bestimmten Satz von Schnittstellen für eine andere VSPackage-Datei, die verwendet werden kann. Visual Studio ist selbst eine Sammlung von VSPackages, die Dienste für andere VSPackages bereitstellt.

Sie können z. B. den SVsActivityLog-Dienst verwenden, um eine IVsActivityLog-Schnittstelle abzurufen, die Sie zum Schreiben in das Aktivitätsprotokoll verwenden können. Weitere Informationen finden Sie unter How to: Use the Activity Log.

Visual Studio bietet auch einige integrierte Dienste, die nicht registriert sind. VSPackages können integrierte oder andere Dienste ersetzen, indem eine Dienstüberschreibung bereitgestellt wird. Für jeden Dienst ist nur eine Dienstüberschreibung zulässig.

Dienste haben keine Auffindbarkeit. Daher müssen Sie die Dienst-ID (SID) eines Diensts kennen, den Sie nutzen möchten, und Sie müssen wissen, welche Schnittstellen sie bereitstellt. Die Referenzdokumentation für den Dienst stellt diese Informationen bereit.

  • VSPackages, die Dienste bereitstellen, werden als Dienstanbieter bezeichnet.

  • Dienste, die anderen VSPackages zur Verfügung gestellt werden, werden als globale Dienste bezeichnet.

  • Dienste, die nur für das VSPackage verfügbar sind, das sie implementiert, oder für jedes objekt, das es erstellt, werden als lokale Dienste bezeichnet.

  • Dienste, die integrierte Dienste oder Dienste ersetzen, die von anderen Paketen bereitgestellt werden, werden als Dienstüberschreibungen bezeichnet.

  • Dienste oder Dienstüberschreibungen werden bei Bedarf geladen, d. h. der Dienstanbieter wird geladen, wenn der von ihr bereitgestellte Dienst von einem anderen VSPackage angefordert wird.

  • Um das Laden bei Bedarf zu unterstützen, registriert ein Dienstanbieter seine globalen Dienste bei Visual Studio. Weitere Informationen finden Sie unter How to: Provide a Service.

  • Nachdem Sie einen Dienst abgerufen haben, verwenden Sie QueryInterface (nicht verwalteter Code) oder Umwandlung (verwalteter Code), um die gewünschte Schnittstelle abzurufen, z. B.:

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • Verwalteter Code verweist auf einen Dienst anhand seines Typs, während nicht verwalteter Code auf einen Dienst anhand seiner GUID verweist.

  • Wenn Visual Studio ein VSPackage lädt, wird ein Dienstanbieter an das VSPackage übergeben, um den VSPackage-Zugriff auf globale Dienste zu gewähren. Dies wird als "Sitzen" des VSPackage bezeichnet.

  • VSPackages können Dienstanbieter für die objekte sein, die sie erstellen. Beispielsweise kann ein Formular eine Anforderung für einen Farbdienst an seinen Frame senden, wodurch die Anforderung an Visual Studio übergeben wird.

  • Verwaltete Objekte, die tief geschachtelt sind oder überhaupt nicht angeordnet sind, rufen möglicherweise GetGlobalService direkten Zugriff auf globale Dienste auf.

Verwenden von GetGlobalService

Es kann vorkommen, dass Sie einen Dienst aus einem Toolfenster oder Steuerelementcontainer abrufen müssen, der nicht vor Ort ist oder mit einem Dienstanbieter gespeichert wurde, der nicht über den gewünschten Dienst informiert ist. Sie können z. B. aus einem Steuerelement in das Aktivitätsprotokoll schreiben. Weitere Informationen zu diesen und anderen Szenarien finden Sie unter How to: Troubleshoot Services.

Sie können die meisten Visual Studio-Dienste abrufen, indem Sie die statische GetGlobalService Methode aufrufen.

GetGlobalService basiert auf einem zwischengespeicherten Dienstanbieter, der initialisiert wird, wenn jedes von Package abgeleitete VSPackage-Objekt zum ersten Mal sited wird. Sie müssen sicherstellen, dass diese Bedingung erfüllt ist oder für einen NULL-Dienst vorbereitet ist.

Glücklicherweise GetGlobalService funktioniert die meiste Zeit richtig.

  • Wenn ein VSPackage einen Dienst bereitstellt, der nur einem anderen VSPackage bekannt ist, wird das VSPackage, das den Dienst anfordert, vor dem Laden des Diensts von VSPackage sited.

  • Wenn ein Toolfenster von einem VSPackage erstellt wird, wird das VSPackage vor dem Erstellen des Toolfensters websiteiert.

  • Wenn ein Steuerelementcontainer von einem Toolfenster gehostet wird, das von einem VSPackage erstellt wird, wird das VSPackage vor dem Erstellen des Steuerelementcontainers sitediert.

So rufen Sie einen Dienst aus einem Toolfenster oder Steuerelementcontainer ab

  • Fügen Sie diesen Code in den Konstruktor-, Toolfenster- oder Steuerelementcontainer ein:

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

    Dieser Code ruft einen SVsActivityLog-Dienst ab und wandelt ihn in eine IVsActivityLog-Schnittstelle um, die zum Schreiben in das Aktivitätsprotokoll verwendet werden kann. Ein Beispiel finden Sie unter How to: Use the Activity Log.