Compartir vía


Conceptos básicos del servicio

Un servicio es un contrato entre dos VSPackages. Un VSPackage proporciona un conjunto específico de interfaces para que otro VSPackage lo consuma. Visual Studio es una colección de VSPackages que proporciona servicios a otros VSPackages.

Por ejemplo, puede usar el servicio SVsActivityLog para obtener una interfaz IVsActivityLog, que puede usar para escribir en el registro de actividad. Para obtener más información, vea Cómo: Usar el registro de actividad.

Visual Studio también proporciona algunos servicios integrados que no están registrados. VSPackages puede reemplazar los servicios integrados u otros servicios proporcionando una invalidación de servicio. Solo se permite una invalidación de servicio para cualquier servicio.

Los servicios no tienen capacidad de detección. Por lo tanto, debe conocer el identificador de servicio (SID) de un servicio que desea consumir y debe saber qué interfaces proporciona. La documentación de referencia del servicio proporciona esta información.

  • Los VSPackages que proporcionan servicios se denominan proveedores de servicios.

  • Los servicios que se proporcionan a otros VSPackages se denominan servicios globales.

  • Los servicios que están disponibles solo para el VSPackage que los implementa, o en cualquier objeto que cree, se denominan servicios locales.

  • Los servicios que reemplazan los servicios o servicios integrados proporcionados por otros paquetes, se denominan invalidaciones de servicio.

  • Los servicios o invalidaciones de servicio se cargan a petición, es decir, el proveedor de servicios se carga cuando otro VSPackage solicita el servicio que proporciona.

  • Para admitir la carga a petición, un proveedor de servicios registra sus servicios globales con Visual Studio. Para obtener más información, vea Cómo: Proporcionar un servicio.

  • Después de obtener un servicio, use QueryInterface (código no administrado) o la conversión (código administrado) para obtener la interfaz deseada, por ejemplo:

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • El código administrado hace referencia a un servicio por su tipo, mientras que el código no administrado hace referencia a un servicio por su GUID.

  • Cuando Visual Studio carga un VSPackage, pasa un proveedor de servicios a VSPackage para conceder al VSPackage acceso a los servicios globales. Esto se conoce como "siting" de VSPackage.

  • VSPackages puede ser proveedores de servicios para los objetos que crean. Por ejemplo, un formulario podría enviar una solicitud de un servicio de color a su marco, lo que podría pasar la solicitud a Visual Studio.

  • Los objetos administrados que están profundamente anidados, o que no se encuentran en absoluto, pueden llamar GetGlobalService a acceso directo a los servicios globales.

Uso de GetGlobalService

A veces, es posible que tenga que obtener un servicio desde una ventana de herramientas o un contenedor de control que no se ha puesto en el sitio, o bien se ha puesto con un proveedor de servicios que no conoce el servicio que desea. Por ejemplo, es posible que quiera escribir en el registro de actividad desde un control. Para obtener más información sobre estos y otros escenarios, vea How to: Troubleshoot Services.

Puede obtener la mayoría de los servicios de Visual Studio llamando al método estático GetGlobalService .

GetGlobalService se basa en un proveedor de servicios almacenados en caché que se inicializa la primera vez que se site cualquier VSPackage derivado de Package. Debe garantizar que se cumpla esta condición o que esté preparada para un servicio NULL.

Afortunadamente, GetGlobalService funciona correctamente la mayor parte del tiempo.

  • Si un VSPackage proporciona un servicio conocido solo por otro VSPackage, el VSPackage que solicita el servicio se encuentra antes de cargar el vsPackage que proporciona el servicio.

  • Si un VSPackage crea una ventana de herramientas, VSPackage se encuentra en el sitio antes de crear la ventana de herramientas.

  • Si un contenedor de control está hospedado por una ventana de herramientas creada por un VSPackage, vsPackage se encuentra en el sitio antes de crear el contenedor de control.

Para obtener un servicio desde una ventana de herramientas o un contenedor de control

  • Inserte este código en el constructor, la ventana de herramientas o el contenedor de control:

    IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
        if (log == null) return;
    

    Este código obtiene un servicio SVsActivityLog y lo convierte en una interfaz IVsActivityLog, que se puede usar para escribir en el registro de actividad. Para obtener un ejemplo, vea Cómo: Usar el registro de actividad.