No se puede obtener un servicio en el SDK de Visual Studio

              Aplicable a: Visual Studio

En este artículo se presentan las causas y soluciones comunes cuando no se puede obtener un servicio en el SDK de Visual Studio.

Si no se puede obtener el servicio solicitado, la llamada a GetService devuelve null. Pruebe siempre el valor NULL después de solicitar un servicio:

IVsActivityLog log =
    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

El servicio no está registrado con Visual Studio

Examine el registro del sistema para ver si el servicio se ha registrado correctamente. Para obtener más información, vea Cómo: Proporcionar un servicio.

En el siguiente ejemplo .reg fragmento de archivo se muestra cómo se puede registrar el servicio SVsTextManager:

[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\<version number>\Services\{F5E7E71D-1401-11d1-883B-0000F87579D2}]
@="{F5E7E720-1401-11d1-883B-0000F87579D2}"
"Name"="SVsTextManager"

En este ejemplo, el número de versión es la versión de Visual Studio, como 12.0 o 14.0, la clave {F5E7E71D-1401-11d1-883B-0000F87579D2} es el identificador de servicio (SID) del servicio, SVsTextManager, y el valor {F5E7E720-1401-11d1-883B-0000F87579D2} predeterminado es el GUID del paquete del VSPackage del administrador de texto, que proporciona el servicio.

El servicio se solicita por tipo de interfaz y no por tipo de servicio

Use el tipo de servicio y no el tipo de interfaz cuando llame a GetService. Al solicitar un servicio de Visual Studio, Package extrae el GUID del tipo . No se encontrará un servicio si:

  • Se pasa un tipo de interfaz a GetService en lugar del tipo de servicio.
  • No se asigna ningún GUID explícitamente a la interfaz. Por lo tanto, el sistema crea un GUID predeterminado para un objeto según sea necesario.

El VSPackage que solicita el servicio no se ha siteado

Asegúrese de que se ha siteado el VSPackage que solicita el servicio. Visual Studio sites a VSPackage después de construirlo y antes de llamar a Initialize.

Si tiene código en un constructor de VSPackage que necesita un servicio, muévalo al Initialize método .

Se usa el proveedor de servicios incorrecto

Asegúrese de que usa el proveedor de servicios correcto.

No todos los proveedores de servicios son iguales. El proveedor de servicios que Visual Studio pasa a una ventana de herramientas difiere del que pasa a un VSPackage. El proveedor de servicios de ventana de herramientas sabe de STrackSelection, pero no conoce SVsRunningDocumentTable. Puede llamar GetGlobalService a para obtener un proveedor de servicios VSPackage desde dentro de una ventana de herramientas.

Si una ventana de herramientas hospeda un control de usuario o cualquier otro contenedor de control, el modelo de componentes de Windows hospedará el contenedor y no tendrá acceso a ningún servicio de Visual Studio. Puede llamar GetGlobalService a para obtener un proveedor de servicios VSPackage desde dentro de un contenedor de control.

Referencias