Sdílet prostřednictvím


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

  1. Vytvořte projekt VSIX (Soubor>nový>projekt>Visual C#>Rozšiřitelnost>projektu VSIX).

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

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

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

  1. 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);
    . . .
    }
    
  2. 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.

  3. 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".