Poskytnutí služby
Balíček VSPackage může poskytovat služby, které můžou používat jiné balíčky VSPackage. K poskytování služby musí balíček VSPackage zaregistrovat službu v sadě Visual Studio a přidat ji.
Třída Package implementuje jak IServiceProvider a IServiceContainer. IServiceContainer obsahuje metody zpětného volání, které poskytují služby na vyžádání.
Další informace o službách naleznete v tématu Základy služby .
Poznámka:
Když se balíček VSPackage chystá uvolnit, sada Visual Studio čeká na doručení všech požadavků na služby, které poskytuje balíček VSPackage. Nepovoluje nové žádosti o tyto služby. Při uvolňování služby byste neměli explicitně volat metodu RevokeService pro odvolání služby.
Implementace služby
Vytvořte projekt VSIX (Soubor>nový>projekt>Visual C#>Rozšiřitelnost>projektu VSIX).
Přidejte do projektu balíček VSPackage. Vyberte uzel projektu v Průzkumník řešení a klikněte na Přidat>novou položku>Visual C# Items>Extensibility>Visual Studio Package.
Pokud chcete implementovat službu, musíte vytvořit tři typy:
Rozhraní, které popisuje službu. Mnoho z těchto rozhraní je prázdných, to znamená, že nemají žádné metody.
Rozhraní, které popisuje rozhraní služby. Toto rozhraní zahrnuje metody, které se mají implementovat.
Třída, která implementuje službu i rozhraní služby.
Následující příklad ukazuje základní implementaci těchto tří typů. Konstruktor třídy služby musí nastavit poskytovatele služeb.
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(); }
Registrace služby
Pokud chcete zaregistrovat službu, přidejte ProvideServiceAttribute ji do balíčku VSPackage, který službu poskytuje. Zde je příklad:
[ProvideService(typeof(SMyService))] [PackageRegistration(UseManagedResourcesOnly = true)] [Guid(VSPackage1.PackageGuidString)] public sealed class VSPackage1 : Package {. . . }
Tento atribut se zaregistruje
SMyService
v sadě Visual Studio.Poznámka:
Chcete-li zaregistrovat službu, která nahrazuje jinou službu se stejným názvem, použijte příkaz ProvideServiceOverrideAttribute. Všimněte si, že je povoleno pouze jedno přepsání služby.
Přidat službu
V inicializátoru VSPackage přidejte službu a přidejte metodu zpětného volání pro vytvoření služeb. Tady je změna, která provede metodu Initialize :
protected override void Initialize() { ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService); ((IServiceContainer)this).AddService(typeof(SMyService), callback); . . . }
Implementujte metodu zpětného volání, která by měla vytvořit a vrátit službu nebo hodnotu null, pokud ji nelze vytvořit.
private object CreateService(IServiceContainer container, Type serviceType) { if (typeof(SMyService) == serviceType) return new MyService(this); return null; }
Poznámka:
Visual Studio může odmítnout žádost o poskytnutí služby. To provede, pokud služba již poskytuje jiný balíček VSPackage.
Teď můžete službu získat a používat její metody. Následující příklad ukazuje použití služby v inicializátoru, ale službu můžete získat kdekoli, kde chcete službu používat.
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(); }
Hodnota
helloString
by měla být "Hello".