Abrufen eines Diensts
Häufig müssen Sie Visual Studio-Dienste abrufen, um auf verschiedene Features zuzugreifen. Im Allgemeinen stellt ein Visual Studio-Dienst eine oder mehrere Schnittstellen bereit, die Sie verwenden können. Sie können die meisten Dienste von einem VSPackage abrufen.
Jede VSPackage, die von Package und deren Standort korrekt abgeleitet wird, kann jeden globalen Dienst anfordern. Da die Package
Klasse implementiert wird IServiceProvider, ist jedes VSPackage, von dem abgeleitet wird Package
, auch ein Dienstanbieter.
Wenn Visual Studio ein PackageObjekt lädt, übergibt es während der Initialisierung ein IServiceProvider Objekt an die SetSite Methode. Dies wird als Sitz des VSPackage bezeichnet. Die Package
Klasse umschließt diesen Dienstanbieter und stellt die GetService Methode zum Abrufen von Diensten bereit.
Abrufen eines Diensts aus einem initialisierten VSPackage
Jede Visual Studio-Erweiterung beginnt mit einem VSIX-Bereitstellungsprojekt, das die Erweiterungsressourcen enthält. Erstellen Sie ein Visual Studio VSIX-Projekt mit dem Namen
GetServiceExtension
. Sie finden die VSIX-Projektvorlage im Dialogfeld "Neues Projekt ", indem Sie nach "vsix" suchen.Fügen Sie nun eine benutzerdefinierte Befehlselementvorlage namens "GetServiceCommand" hinzu. Wechseln Sie im Dialogfeld "Neues Element hinzufügen" zu Visual C#>Erweiterbarkeit, und wählen Sie "Benutzerdefinierter Befehl" aus. Ändern Sie im Feld "Name " unten im Fenster den Befehlsdateinamen in "GetServiceCommand.cs". Weitere Informationen zum Erstellen eines benutzerdefinierten Befehls, Erstellen einer Erweiterung mit einem Menübefehl
Entfernen Sie in "GetServiceCommand.cs" den Textkörper der
MenuItemCommand
Methode, und fügen Sie den folgenden Code hinzu:IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog; if (activityLog == null) return; System.Windows.Forms.MessageBox.Show("Found the activity log service.");
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.
Erstellen Sie das Projekt, und starten Sie das Debugging. Die experimentelle Instanz wird geöffnet.
Suchen Sie im Menü "Extras " der experimentellen Instanz die Schaltfläche "GetServiceCommand aufrufen". Wenn Sie auf diese Schaltfläche klicken, sollte ein Meldungsfeld mit der Meldung " Aktivitätsprotokolldienst gefunden" angezeigt werden.
Abrufen eines Diensts aus einem Toolfenster oder Steuerelementcontainer
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.
Die statische GetGlobalService Methode basiert auf einem zwischengespeicherten Dienstanbieter, der initialisiert wird, wenn jedes von der Sited abgeleitete Package VSPackage-Paket zum ersten Mal initialisiert wird.
Da der VSPackage-Konstruktor aufgerufen wird, bevor die VSPackage-Website verwendet wird, sind globale Dienste in der Regel nicht im VSPackage-Konstruktor verfügbar. Siehe Vorgehensweise: Behandeln von Problemen mit Diensten für eine Problemumgehung.
Hier ist ein Beispiel für die Möglichkeit, einen Dienst in einem Toolfenster oder einem anderen Nicht-VSPackage-Element abzurufen.
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;
Abrufen eines Diensts aus dem DTE-Objekt
Sie können auch Dienste aus DTEClass dem Objekt abrufen. Sie müssen jedoch das DTE-Objekt als Dienst aus einem VSPackage abrufen oder die statische GetGlobalService Methode aufrufen.
Das DTE-Objekt implementiert IServiceProvider, das Sie zum Abfragen eines Diensts mithilfe von GetService.
Hier erfahren Sie, wie Sie einen Dienst aus dem DTE-Objekt abrufen.
// 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.");
}
}