Поделиться через


Предоставление службы

VSPackage может предоставлять службы, которые могут использовать другие VSPackage. Чтобы предоставить службу, VSPackage должен зарегистрировать службу в Visual Studio и добавить службу.

Класс Package реализует оба IServiceProvider и IServiceContainer. IServiceContainer содержит методы обратного вызова, предоставляющие службы по запросу.

Дополнительные сведения о службах см. в разделе "Основные сведения о службах ".

Примечание.

Когда VSPackage будет выгружен, Visual Studio ожидает, пока не будут доставлены все запросы на службы, предоставляемые VSPackage. Он не разрешает новые запросы для этих служб. При выгрузке не следует явно вызывать RevokeService метод для отзыва службы.

Реализация службы

  1. Создайте проект VSIX (файл>нового>проекта>Visual C#>Extensibility>VSIX Project).

  2. Добавьте VSPackage в проект. Выберите узел проекта в Обозреватель решений и нажмите кнопку Добавить>новый элемент>Visual C# Items>Extensibility>Visual Studio Package.

  3. Чтобы реализовать службу, необходимо создать три типа:

    • Интерфейс, описывающий службу. Многие из этих интерфейсов пусты, то есть у них нет методов.

    • Интерфейс, описывающий интерфейс службы. Этот интерфейс включает в себя методы, которые необходимо реализовать.

    • Класс, реализующий как службу, так и интерфейс службы.

      В следующем примере показана базовая реализация трех типов. Конструктор класса службы должен задать поставщика услуг.

    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();
    }
    
    

Регистрация службы

  1. Чтобы зарегистрировать службу, добавьте ProvideServiceAttribute его в VSPackage, который предоставляет службу. Рассмотрим пример:

    [ProvideService(typeof(SMyService))]
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [Guid(VSPackage1.PackageGuidString)]
    public sealed class VSPackage1 : Package
    {. . . }
    

    Этот атрибут регистрируется SMyService в Visual Studio.

    Примечание.

    Чтобы зарегистрировать службу, которая заменяет другую службу тем же именем, используйте .ProvideServiceOverrideAttribute Обратите внимание, что разрешено только одно переопределение службы.

Добавление службы

  1. В инициализаторе VSPackage добавьте службу и добавьте метод обратного вызова для создания служб. Ниже приведены изменения, которые необходимо внести в Initialize метод:

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. Реализуйте метод обратного вызова, который должен создавать и возвращать службу, или значение NULL, если оно не может быть создано.

    private object CreateService(IServiceContainer container, Type serviceType)
    {
        if (typeof(SMyService) == serviceType)
            return new MyService(this);
        return null;
    }
    

    Примечание.

    Visual Studio может отклонить запрос на предоставление службы. Это делается, если другой VSPackage уже предоставляет службу.

  3. Теперь вы можете получить службу и использовать ее методы. В приведенном ниже примере показано использование службы в инициализаторе, но вы можете получить службу в любом месте, где вы хотите использовать службу.

    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();
    }
    

    Значение helloString должно быть "Hello".