Не удается получить службу в пакете SDK для Visual Studio
Область применения: Visual Studio
В этой статье приводятся распространенные причины и решения, когда вы не можете получить службу в пакете SDK Для Visual Studio.
Если запрошенная служба не может быть получена, вызов GetService возвращает значение NULL. Всегда проверяйте значение NULL после запроса службы:
IVsActivityLog log =
GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;
Служба не зарегистрирована в Visual Studio
Проверьте системный реестр, чтобы узнать, правильно ли зарегистрирована служба. Дополнительные сведения см. в разделе "Практическое руководство. Предоставление службы".
В следующем примере фрагмента файла .reg показано, как может быть зарегистрирована служба SVsTextManager:
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\<version number>\Services\{F5E7E71D-1401-11d1-883B-0000F87579D2}]
@="{F5E7E720-1401-11d1-883B-0000F87579D2}"
"Name"="SVsTextManager"
В этом примере номер версии — это версия Visual Studio, например 12.0 или 14.0, ключом {F5E7E71D-1401-11d1-883B-0000F87579D2}
является идентификатор службы (SID) службы, SVsTextManager, а значением {F5E7E720-1401-11d1-883B-0000F87579D2}
по умолчанию является guid пакета VSPackage текстового диспетчера, который предоставляет службу.
Служба запрашивается по типу интерфейса, а не по типу службы
Используйте тип службы, а не тип интерфейса при вызове GetService
. При запросе службы из Visual Studio Package извлекает GUID из типа. Служба не будет найдена, если:
- Тип интерфейса передается
GetService
вместо типа службы. - Идентификатор GUID явно не назначается интерфейсу. Поэтому система создает GUID по умолчанию для объекта по мере необходимости.
VSPackage, запрашивающий службу, не был сайт
Убедитесь, что VSPackage запрашивает службу. Visual Studio сайты VSPackage после его создания и перед вызовом Initialize.
Если у вас есть код в конструкторе VSPackage, который нуждается в службе, переместите его в Initialize
метод.
Используется неправильный поставщик услуг
Убедитесь, что вы используете правильный поставщик услуг.
Не все поставщики услуг похожи. Поставщик услуг, который Visual Studio передает в окно инструментов, отличается от того, который он передает в VSPackage. Поставщик служб окна инструментов знает об STrackSelectionэтом, но не знает об SVsRunningDocumentTableэтом. Вы можете вызвать GetGlobalService поставщика служб VSPackage из окна инструментов.
Если окно инструментов размещает пользовательский элемент управления или любой другой контейнер управления, контейнер будет размещен моделью компонентов Windows и не будет иметь доступа к каким-либо службам Visual Studio. Вы можете вызвать GetGlobalService поставщика служб VSPackage из контейнера элементов управления.