Bereitstellen eines Diensts
Ein VSPackage kann Dienste bereitstellen, die andere VSPackages verwenden können. Um einen Dienst bereitzustellen, muss ein VSPackage den Dienst bei Visual Studio registrieren und den Dienst hinzufügen.
Die Package Klasse implementiert sowohl als IServiceContainerauch IServiceProvider . IServiceContainer enthält Rückrufmethoden, die Dienste bei Bedarf bereitstellen.
Weitere Informationen zu Diensten finden Sie unter Service Essentials .
Hinweis
Wenn ein VSPackage gerade entladen werden soll, wartet Visual Studio, bis alle Anforderungen für Dienste, die ein VSPackage bereitstellt, zugestellt wurden. Es lässt keine neuen Anforderungen für diese Dienste zu. Sie sollten die RevokeService Methode nicht explizit aufrufen, um einen Dienst beim Entladen zu widerrufen.
Implementieren eines Diensts
Erstellen Sie ein VSIX-Projekt (File>New>Project>Visual C#>Extensibility>VSIX Project).
Fügen Sie dem Projekt ein VSPackage hinzu. Wählen Sie den Projektknoten im Projektmappen-Explorer aus, und klicken Sie auf "Visual C#-Elementerweiterung>>visual Studio-Paket hinzufügen>>".
Um einen Dienst zu implementieren, müssen Sie drei Typen erstellen:
Eine Schnittstelle, die den Dienst beschreibt. Viele dieser Schnittstellen sind leer, d. h., sie haben keine Methoden.
Eine Schnittstelle, die die Dienstschnittstelle beschreibt. Diese Schnittstelle enthält die zu implementierenden Methoden.
Eine Klasse, die sowohl den Dienst als auch die Dienstschnittstelle implementiert.
Das folgende Beispiel zeigt eine grundlegende Implementierung der drei Typen. Der Konstruktor der Dienstklasse muss den Dienstanbieter festlegen.
public class MyService : SMyService, IMyService { private Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider; private string myString; public MyService(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp) { Trace.WriteLine( "Constructing a new instance of MyService"); serviceProvider = sp; } public void Hello() { myString = "hello"; } public string Goodbye() { return "goodbye"; } } public interface SMyService { } public interface IMyService { void Hello(); string Goodbye(); }
Registrieren eines Diensts
Um einen Dienst zu registrieren, fügen Sie den ProvideServiceAttribute VSPackage hinzu, der den Dienst bereitstellt. Hier ist ein Beispiel:
[ProvideService(typeof(SMyService))] [PackageRegistration(UseManagedResourcesOnly = true)] [Guid(VSPackage1.PackageGuidString)] public sealed class VSPackage1 : Package {. . . }
Dieses Attribut registriert
SMyService
sich bei Visual Studio.Hinweis
Um einen Dienst zu registrieren, der einen anderen Dienst durch denselben Namen ersetzt, verwenden Sie die ProvideServiceOverrideAttribute. Beachten Sie, dass nur eine Außerkraftsetzung eines Diensts zulässig ist.
Hinzufügen eines Diensts
Fügen Sie im VSPackage-Initializer den Dienst hinzu, und fügen Sie eine Rückrufmethode zum Erstellen der Dienste hinzu. Dies ist die Änderung, die an der Initialize Methode vorgenommen werden soll:
protected override void Initialize() { ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService); ((IServiceContainer)this).AddService(typeof(SMyService), callback); . . . }
Implementieren Sie die Rückrufmethode, die den Dienst erstellen und zurückgeben soll, oder null, wenn er nicht erstellt werden kann.
private object CreateService(IServiceContainer container, Type serviceType) { if (typeof(SMyService) == serviceType) return new MyService(this); return null; }
Hinweis
Visual Studio kann eine Anforderung zum Bereitstellen eines Diensts ablehnen. Dies geschieht, wenn bereits ein anderer VSPackage den Dienst bereitstellt.
Jetzt können Sie den Dienst abrufen und seine Methoden verwenden. Das folgende Beispiel zeigt die Verwendung des Diensts im Initialisierungsprogramm, Sie können den Dienst jedoch überall abrufen, wo Sie den Dienst verwenden möchten.
protected override void Initialize() { ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService); ((IServiceContainer)this).AddService(typeof(SMyService), callback); MyService myService = (MyService) this.GetService(typeof(SMyService)); myService.Hello(); string helloString = myService.Goodbye(); base.Initialize(); }
Der Wert sollte
helloString
"Hello" sein.