Não é possível obter um serviço no SDK do Visual Studio
Aplica-se a: Visual Studio 2022
Este artigo apresenta causas e soluções comuns quando você não consegue obter um serviço no SDK do Visual Studio.
Se o serviço solicitado não puder ser obtido, a chamada para GetService retornar será nula. Sempre teste para nulo depois de solicitar um serviço:
IVsActivityLog log =
GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;
O serviço não está registrado no Visual Studio
Examine o registro do sistema para ver se o serviço foi registrado corretamente. Para obter mais informações, consulte Como fornecer um serviço.
O seguinte exemplo .reg fragmento de arquivo mostra como o serviço SVsTextManager pode ser registrado:
[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\<version number>\Services\{F5E7E71D-1401-11d1-883B-0000F87579D2}]
@="{F5E7E720-1401-11d1-883B-0000F87579D2}"
"Name"="SVsTextManager"
Neste exemplo, o número da versão é a versão do Visual Studio, como 12.0 ou 14.0, a chave {F5E7E71D-1401-11d1-883B-0000F87579D2}
é o SID (identificador de serviço) do serviço, SVsTextManager, e o valor {F5E7E720-1401-11d1-883B-0000F87579D2}
padrão é o guid de pacote do gerenciador de texto VSPackage, que fornece o serviço.
O serviço é solicitado por tipo de interface e não por tipo de serviço
Use o tipo de serviço e não o tipo de interface quando você chama GetService
. Ao solicitar um serviço do Visual Studio, Package extrai o GUID do tipo. Um serviço não será encontrado se:
- Um tipo de interface é passado para
GetService
em vez do tipo de serviço. - Nenhum GUID é atribuído explicitamente à interface. Portanto, o sistema cria um GUID padrão para um objeto conforme necessário.
O VSPackage que solicita o serviço não foi site
Certifique-se de que o VSPackage que solicita o serviço foi site. O Visual Studio sites um VSPackage depois de construí-lo e antes de chamar Initialize.
Se você tiver código em um construtor VSPackage que precisa de um serviço, mova-o para o Initialize
método.
O provedor de serviços errado é usado
Certifique-se de que você está usando o provedor de serviços correto.
Nem todos os provedores de serviços são iguais. O provedor de serviços que o Visual Studio passa para uma janela de ferramentas é diferente daquele que ele passa para um VSPackage. O provedor de serviços de janela de ferramentas sabe sobre STrackSelection, mas não sabe sobre SVsRunningDocumentTable. Você pode chamar GetGlobalService para obter um provedor de serviços VSPackage de dentro de uma janela de ferramenta.
Se uma janela de ferramenta hospedar um controle de usuário ou qualquer outro contêiner de controle, o contêiner será localizado pelo modelo de componente do Windows e não terá acesso a nenhum serviço do Visual Studio. Você pode chamar GetGlobalService para obter um provedor de serviços VSPackage de dentro de um contêiner de controle.