У меня есть два 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" выполнены. Может ли кто-нибудь сказать мне, что мне не хватает?