Как использовать сервис, предоставляемый VSPackage A, в VSPackage B?

У меня есть два VSPackage. Первый предоставляет глобальную услугу. Оба пакета VSPackage используют службу.

Служба определяется, как описано в MSDN "How To : Зарегистрируйте службу". Я не упомянул ComVisibleAttribute, потому что в инструкциях говорится, что он требуется только в том случае, если служба должна быть доступна в неуправляемом коде, а это не так. Интерфейсы такие

[Guid("5A72348D-617B-4960-B07A-DC6CC5AA7675")]
public interface SMessageBus {}

[Guid("04A499BA-CE09-48AF-96D5-F32DEAF0754C")]
public interface IMessageBus { ... }

Пакет предоставления услуг соответствует MSDN "Как: Оказать услугу". Это выглядит как:

[<package atttributes>]
[ProvideService(typeof(SMessageBus))]
public sealed class MessageBusProviderPackage : Package
{
  public MessageBusProviderPackage()
  {
    var serviceContainer = this as IServiceContainer;
    var serviceCreatorCallback = new ServiceCreatorCallback(CreateMessageBusService);
    serviceContainer.AddService(typeof(SMessageBus), serviceCreatorCallback, true);
  }

  private object CreateMessageBusService(IServiceContainer container, Type serviceType)
  {
    // this gets called and returns a new bus instance
    return (serviceType == typeof(SMessageBus)) ? new MyMessageBus() : null;
  }

  protected override void Initialize()
  {
    // this is called after the package was constructed
    // the call leads to the service being created by CreateMessageService()
    var messageBus = GetService(typeof(SMessageBus)) as IMessageBus;
    // the bus is retrieved correctly
    ...
  }
}

Этот другой пакет объявлен как

[<package attributes>]
[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
public sealed class MessageGeneratorPackage : Package
{
  protected override void Initialize()
  {
    // the call below is reached first, in its course the provider is loaded
    var service = GetService(type(SMessageBus));
    // this point is reached last, but service is null
    ...
  }
}

Я провел отладку на этапе запуска и обнаружил, что сначала создается и инициализируется MessageGeneratorPackage. Это означает, что пакет был размещен. Когда достигается вызов GetService() в Initialize(), VS загружает моего поставщика услуг, т. е. ProvideServiceAttribute правильно помечает MessageBusProviderPackage как поставщика службы SMessageBus. Создается экземпляр пакета провайдера и вызывается его метод Initialize(), при этом служба успешно извлекается. После этого инициализация потребительского пакета продолжается, но сервисный запрос возвращает null. Мне кажется, что все требования, указанные в MSDN " How To: Troubleshoot Services" выполнены. Может ли кто-нибудь сказать мне, что мне не хватает?


person Sven Amann    schedule 15.10.2013    source источник


Ответы (1)


Сам нашел ответ... переопределения Initialize() должны вызывать base.Initialize(), поскольку зарегистрированные службы фактически продвигаются в контейнеры родительских служб.

person Sven Amann    schedule 15.10.2013