Não é possível obter um serviço no SDK do Visual Studio
Aplica-se a: Visual Studio
Este artigo apresenta causas e soluções comuns quando você não pode obter um serviço no SDK do Visual Studio.
Se o serviço solicitado não puder ser obtido, a chamada para GetService retornará nulo. Sempre teste null 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 fragmento de arquivo .reg de amostra a seguir 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 do 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 ao chamar 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 em
GetService
vez do tipo de serviço. - Nenhum GUID é explicitamente atribuído à 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 localizado
Certifique-se de que o VSPackage que solicita o serviço tenha sido localizado. O Visual Studio coloca um VSPackage em sites 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 conhece o STrackSelection, mas não conhece SVsRunningDocumentTableo . Você pode chamar GetGlobalService para obter um provedor de serviços VSPackage de dentro de uma janela de ferramentas.
Se uma janela de ferramentas 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.