Partilhar via


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.

Referências