Componentes de una extensión de Visual Studio para la extensibilidad

Una extensión que usa VisualStudio.Extensibility normalmente tiene varios componentes que interactúan juntos y también con Visual Studio.

Instancia de extensión

Las extensiones deben tener una clase que derive de Extension. Para obtener un ejemplo de implementación, vea MarkdownLinter.

Una instancia de la clase Extension es el punto de partida para la ejecución de la extensión. Esta instancia contiene los métodos necesarios para Visual Studio consultar los servicios proporcionados por la extensión. También proporciona métodos virtuales para que la extensión proporcione recursos localizados y servicios locales propiedad de la extensión que se compartirán entre los componentes de la extensión.

La configuración para la clase Extension también contiene los metadatos para la extensión que se muestra en la ventana de Visual Studio Administrar extensiones y, para las extensiones publicadas, en el Visual Studio Marketplace.

[VisualStudioContribution]
public class MarkdownLinterExtension : Extension
{
    /// <inheritdoc/>
    public override ExtensionConfiguration ExtensionConfiguration => new()
    {
        Metadata = new(
                id: "MarkdownLinter.0cf26ba2-edd5-4419-8646-a55d0a83f7d8",
                version: this.ExtensionAssemblyVersion,
                publisherName: "Microsoft",
                displayName: "Markdown Linter Sample Extension",
                description: "Sample markdown linter extension"),
    };
    ...

Para los desarrolladores de extensiones que están familiarizados con las API de VSSDK existentes, el Metadata contenido en ExtensionConfiguration se usa para generar el archivo .vsixmanifest. Además, la clase Extension es similar a la clase AsyncPackage que se usa en el modelo de extensibilidad de VSSDK.

Objeto VisualStudioExtensibility

El objeto VisualStudioExtensibility actúa como punto de entrada para las características de extensibilidad expuestas por Visual Studio. Esta clase tiene varios métodos de extensión, propiedades para enumerar rápidamente las características disponibles en el SDK de extensibilidad. Consulte la documentación de la API para ver los métodos disponibles.

Elementos de extensión

Para las características en las que una extensión contribuye a los componentes a Visual Studio, como comandos, agentes de escucha del editor, ventanas de herramientas, etc., las extensiones usan clases marcadas con el atributo VisualStudioContribution. El proceso de compilación genera los metadatos correctos para asegurarse de que estos componentes se pueden detectar mediante Visual Studio.

Actualmente, el SDK admite un conjunto limitado de componentes que pueden integrarse.

Las instancias de estas clases se crean como parte del marco de extensibilidad proporcionado por el SDK mediante una biblioteca de inserción de dependencias y los constructores se pueden usar para recuperar instancias de servicios proporcionados por el SDK o por la propia extensión para compartir el estado entre los componentes.

Duración de los elementos de extensión

La duración de cada elemento se administra mediante el componente correspondiente que carga esas partes dentro de IDE de Visual Studio proceso.

  • Los controladores de comandos se inicializan cuando se activa el conjunto de comandos correspondiente, que puede ser durante la primera ejecución del comando. Una vez activado, los controladores de comandos solo se deben eliminar cuando se cierra el IDE.

  • De manera similar, los oyentes de eventos de la vista de texto se inicializan cuando se carga en el IDE la primera vista de texto que coincide con el tipo de contenido especificado. Actualmente, estos agentes de escucha están activos hasta que se cierra el IDE, pero este comportamiento puede cambiar en el futuro.

En general, para extensiones complejas, se recomienda que las extensiones proporcionen servicios locales que los elementos pueden importar en su constructor y usar esos servicios para compartir el estado entre partes y entre instancias de la misma parte. Esta práctica garantiza que el estado de la extensión no se vea afectado por los cambios en la vida útil de los elementos de la extensión.

Servicios proporcionados por el SDK para servicios de inserción y extensión local

El SDK de extensibilidad de VisualStudio.Extensibility usa la inserción de dependencias para permitir que los componentes ingieren servicios integrados y también los servicios ofrecidos por la extensión localmente para compartirse entre distintos componentes. Consulte la sección de inserción de dependencias para obtener más información sobre los servicios ofrecidos por el SDK, los tiempos de vida del servicio y los casos de uso de ejemplo de inserción de dependencias.

Para obtener un ejemplo de cómo se usan los servicios locales, consulte MarkdownLinter extensión.

Contexto de cliente

Dado que todas las extensiones del nuevo SDK se ejecutan sin proceso, presentamos el concepto de contexto de cliente para varias partes de extensión para representar el estado del IDE en el momento en que se invoca el evento o el método. Este contexto se representa mediante la instancia de IClientContext en el SDK y se pasa a varias operaciones, como controladores de ejecución de comandos. El SDK proporciona métodos de extensión en IClientContext que se pueden usar para recuperar objetos del contexto. Por ejemplo, las extensiones pueden obtener la vista de texto activa o el URI de los elementos seleccionados en el momento de la ejecución del comando mediante la instancia de IClientContext.

Algunos componentes, como los comandos, también permiten declarar qué contextos les interesan. Esto se hace para optimizar la cantidad de datos transferidos en cada ejecución remota, ya que el contexto de cliente puede ser grande en el futuro. En la versión preliminar inicial, solo hay dos contextos disponibles, Shell y Editor, y ambos se incluyen de forma predeterminada al declarar un comando mediante CommandAttribute.