Compartir a través de


Obtención de un servicio

A menudo, necesita obtener servicios de Visual Studio para acceder a diferentes características. En general, un servicio de Visual Studio proporciona una o varias interfaces que puede usar. Puede obtener la mayoría de los servicios de un VSPackage.

Cualquier VSPackage que derive de Package y que se haya sitio correctamente puede solicitar cualquier servicio global. Dado que la Package clase implementa IServiceProvider, cualquier VSPackage que derive de también es un proveedor de Package servicios.

Cuando Visual Studio carga un Packageobjeto , pasa un IServiceProvider objeto al método durante la SetSite inicialización. Esto se denomina siting the VSPackage. La Package clase encapsula este proveedor de servicios y proporciona el GetService método para obtener servicios.

Obtención de un servicio a partir de un VSPackage inicializado

  1. Cada extensión de Visual Studio comienza con un proyecto de implementación VSIX, que contendrá los recursos de extensión. Cree un proyecto VSIX de Visual Studio denominado GetServiceExtension. Puede encontrar la plantilla de proyecto VSIX en el cuadro de diálogo Nuevo proyecto buscando "vsix".

  2. Ahora agregue una plantilla de elemento de comando personalizada denominada GetServiceCommand. En el cuadro de diálogo Agregar nuevo elemento, vaya a Visual C#>Extensibilidad y seleccione Comando personalizado. En el campo Nombre de la parte inferior de la ventana, cambie el nombre del archivo de comando a GetServiceCommand.cs. Para obtener más información sobre cómo crear un comando personalizado, Crear una extensión con un comando de menú

  3. En GetServiceCommand.cs, quite el cuerpo del MenuItemCommand método y agregue el código siguiente:

    IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (activityLog == null) return;
    System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    
    

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

  4. Compile la solución y comience la depuración. Aparece la instancia experimental.

  5. En el menú Herramientas de la instancia experimental, busque el botón Invocar GetServiceCommand . Al hacer clic en este botón, debería ver un cuadro de mensaje que indica Found the activity log service (Encontrado el servicio de registro de actividad).

Obtención de un servicio desde una ventana de herramientas o un contenedor de control

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.

El método estático GetGlobalService se basa en un proveedor de servicios almacenado en caché que se inicializa la primera vez que cualquier VSPackage derivado de Package se encuentra en el sitio.

Dado que se llama al constructor VSPackage antes de que se encuentre el VSPackage, los servicios globales normalmente no están disponibles desde dentro del constructor VSPackage. Consulte Solución de problemas de servicios para obtener una solución alternativa.

Este es un ejemplo de la forma de obtener un servicio en una ventana de herramientas u otro elemento que no sea VSPackage.

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

Obtención de un servicio del objeto DTE

También puede obtener servicios del DTEClass objeto . Sin embargo, debe obtener el objeto DTE como servicio de un VSPackage o llamando al método estático GetGlobalService .

El objeto DTE implementa IServiceProvider, que puede usar para consultar un servicio mediante GetService.

Aquí se muestra cómo obtener un servicio del objeto DTE.

// Start with the DTE object, for example: 
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));

ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
    IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (log != null)
    {
        System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    }
}