Compartir a través de


Uso del SDK de VisualStudio.Extensibility y VSSDK juntos

Aunque el modelo de extensibilidad de VisualStudio.Extensibility se creó principalmente para hospedar extensiones fuera del proceso de devenv.exe, es posible usar las API del SDK de extensibilidad de VisualStudio.Extensibility en una extensión que se ejecuta en el proceso de Visual Studio y usar las API de extensibilidad tradicionales proporcionadas por los paquetes de microsoft.VisualStudio.Sdk.

La compatibilidad del uso en proceso está diseñada para permitir que los usuarios pioneros utilicen las nuevas API de VisualStudio.Extensibility a la vez que se basan en Microsoft.VisualStudio.Sdk para cubrir cualquier brecha de funciones.

Este documento es un tutorial rápido sobre diferentes opciones para usar el SDK de VisualStudio.Extensibility en proceso.

  • Si va a desarrollar una nueva extensión, nuestro método recomendado es crear una VisualStudio.Extension hospedada dentro del proceso siguiendo este tutorial. Este método permite usar funcionalidades completas del SDK de extensibilidad de VisualStudio.Extensibility además de poder insertar servicios VSSDK y MEF.

  • Si tiene una extensión VSSDK existente, puede seguir estas sugerencias para usar la nueva instancia de VisualStudioExtensibility en su extensión.

  • Si desea agregar comandos, visualizadores de depuración, ventanas de herramientas a la extensión VSSDK existente, mediante el SDK de VisualStudio.Extensibility, puede consultar estas sugerencias para alojar tanto una extensión VSSDK como una extensión VisualStudio.Extensibility en el mismo proyecto de extensión de VS.

Creación de la primera extensión VisualStudio.Extensibility compatible con VSSDK

Aunque el modelo de extensibilidad de VisualStudio.Extensibility se creó principalmente para hospedar extensiones fuera del proceso de devenv.exe, a partir de Visual Studio 2022 17.4 Preview 1, es posible crear una extensión de extensibilidad de VisualStudio.Extensibility hospedada en devenv.exe y puede usar las API de extensibilidad tradicionales proporcionadas por los paquetes de Microsoft.VisualStudio.Sdk.

Prerrequisitos

  • Visual Studio 2022, versión preliminar 17.9, 1 o superior, con la carga de trabajo Visual Studio extension development.
  • Si va a actualizar desde compilaciones anteriores, asegúrese de desinstalar VisualStudio.Extensibility Project System para evitar posibles conflictos.

Creación del proyecto de extensión

  • Utilice la extensión VisualStudio.Extensibility con la plantilla de compatibilidad de VSSDK para crear una nueva solución.

Captura de pantalla de la plantilla de proyecto de extensión en proceso de VisualStudio.Extensibility.

Depura tu extensión

  • Presione F5 para iniciar la depuración, esto compila la extensión e la implementa en la instancia experimental de la versión de Visual Studio que usa. El depurador debe conectarse una vez que la extensión esté cargada.

  • Puede encontrar el comando en Extensions menú, como se muestra en la siguiente imagen:

    Captura de pantalla que muestra el comando de extensión de ejemplo.

Consumo de servicios del SDK de Visual Studio desde una extensión de VisualStudio.Extensibility

Un proyecto de extensión compatible con VS-SDK hace referencia al paquete de microsoft.VisualStudio.Sdk, que permite el acceso a todos los servicios del SDK de Visual Studio.

Tradicionalmente, estos servicios se consumen a través de MEF o AsyncServiceProvider. En su lugar, se recomienda un extensor de VisualStudio.Extensibility para la inserción de dependencias de .NET.

Las clases MefInjection<TService> y AsyncServiceProviderInjection<TService, TInterface>, ambas del espacio de nombres Microsoft.VisualStudio.Extensibility.VSSdkCompatibility, permiten consumir los servicios del SDK de Visual Studio, agregándolos al constructor de una clase que se instancia mediante la inserción de dependencias (como un comando, una ventana de herramientas o una parte de extensión).

En el ejemplo siguiente se muestra cómo se pueden agregar los servicios DTE2 y IBufferTagAggregatorFactoryService a un comando .

    [VisualStudioContribution]
    public class Command1 : Command
    {
        private TraceSource traceSource;
        private AsyncServiceProviderInjection<DTE, DTE2> dte;
        private MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService;

        public Command1(
            VisualStudioExtensibility extensibility,
            TraceSource traceSource,
            AsyncServiceProviderInjection<DTE, DTE2> dte,
            MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService)
            : base(extensibility)
        {
            this.dte = dte;
            this.bufferTagAggregatorFactoryService = bufferTagAggregatorFactoryService;
        }
    
        public override CommandConfiguration CommandConfiguration => new("Sample Remote Command")
        {
            Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
            Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        };

Anatomía de una extensión de VisualStudio.Extensibility compatible con VSSDK

Aunque el uso de la extensión de VisualStudio.Extensibility con la plantilla de compatibilidad con VSSDK se encarga de configurar todo el proyecto, resulta útil saber cuáles son los componentes básicos de una extensión compatible con VS-SDK de VisualStudio.Extensibility y en qué se diferencia de la variante común que se describe en la guía "crear tu primera extensión".

TargetFramework y VssdkCompatibleExtension

El proyecto de extensión debe tener como destino la versión de .NET que usa la versión de Visual Studio de destino. Para Visual Studio 2022, deben tener como destino .NET Framework 4.7.2.

El proyecto de extensión también debe contener la propiedad VssdkCompatibleExtension establecida en true.

<PropertyGroup>
  <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>

Propiedad RequiresInProcessHosting

La clase Extension debe configurarse con la propiedad RequiresInProcessHosting = true que identifica la extensión como en proceso.

[VisualStudioContribution]
internal class MyExtension : Extension
{
    public override ExtensionConfiguration? ExtensionConfiguration => new()
    {
        RequiresInProcessHosting = true,
    };

    ...

Manifiesto del paquete

El proyecto de extensión debe incluir un manifiesto de paquete denominado source.extension.vsixmanifest. La etiqueta Installation debe tener ExtensionType establecido en VSSDK+VisualStudio.Extensibility.

<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
    <Metadata>
        <Identity Id="MyExtensionId.f14b8c45-154f-4584-abd7-9ec22af003e2" Version="1.0" Language="en-US" Publisher="Microsoft" />
        <DisplayName>My extension</DisplayName>
        <Description xml:space="preserve">My extension's description.</Description>
    </Metadata>
    <Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
        <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
            <ProductArchitecture>amd64</ProductArchitecture>
        </InstallationTarget>
      <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
        <ProductArchitecture>arm64</ProductArchitecture>
      </InstallationTarget>
    </Installation>
    <Prerequisites>
        <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
    </Prerequisites>
    <Assets>
        <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
    </Assets>
</PackageManifest>

Cómo utilizar VisualStudio.Extensibility desde las extensiones existentes de VSSDK

Para las extensiones de VSSDK existentes, otra opción es consultar a través del proveedor de servicios la instancia de VisualStudioExtensibility y utilizar sus métodos. Este método te permite usar la nueva superficie de la API del SDK de extensibilidad de VisualStudio.Extensibility en tus componentes existentes. Esta opción puede ser útil en situaciones en las que le gusta usar la nueva API para consultar la información del proyecto, la administración de documentos sin crear una nueva extensión basada en la extensibilidad de VisualStudio.Extensibility.

Este es un fragmento de código de ejemplo que muestra cómo se puede usar VisualStudioExtensibility dentro de un paquete VSSDK:

  • En el archivo .csproj, incluya una referencia de paquete a las API de extensibilidad de VisualStudio.Extensibility:
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.2092" />
  </ItemGroup>
  • Ahora puede consultar la instancia de VisualStudioExtensibility a través del método GetServiceAsync en su paquete u otros componentes:
...
using Microsoft.VisualStudio.Extensibility;
...

public class VSSDKPackage : AsyncPackage
{
    protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
    {
        VisualStudioExtensibility extensibility = await this.GetServiceAsync<VisualStudioExtensibility, VisualStudioExtensibility>();
        await extensibility.Shell().ShowPromptAsync("Hello from in-proc", PromptOptions.OK, cancellationToken);
        ...
    }
}

Agregar una extensión de extensibilidad de VisualStudio.Extensibility a un proyecto de extensión VSSDK existente

Si también quiere contribuir con componentes como ventanas de herramientas y escuchadores del editor mediante el SDK de extensibilidad de VisualStudio.Extensibility dentro de su extensión VSSDK existente, deberá seguir pasos adicionales para crear una instancia de VisualStudio.Extensibility Extension en su proyecto.

  • Necesita un estilo de SDK .csproj para usar paquetes del SDK de extensibilidad de VisualStudio.Extensibility. En el caso de los proyectos existentes, es posible que deba actualizar su .csproj a uno de estilo SDK.

  • Quite la referencia de paquete para Microsoft.VSSDK.BuildTools y, en su lugar, agregue referencias de paquete para VisualStudio.Extensibility.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" />
  • Agregue la propiedad VssdkCompatibleExtension en el archivo del proyecto, estableciéndola en true. Esta propiedad habilitará algunas características de VSSDK para la compatibilidad.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • Cree una nueva clase de extensión que herede de la Extension clase base y establezca la propiedad RequiresInProcessHosting tal como se mostró anteriormente.
  • Modifique el archivo source.extension.vsixmanifest agregando ExtensionType="VSSDK+VisualStudio.Extensibility" a la etiqueta Installation.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

Ahora puede usar todas las funcionalidades de VisualStudio.Extensibility junto con la extensión VSSDK existente.