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 utilizar el SDK de extensibilidad de VisualStudio.Extensibility en el mismo proceso.

  • Si vas a desarrollar una nueva extensión, nuestro método recomendado es crear una extensión VisualStudio.Extension integrada en el 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 tienes una extensión VSSDK existente, puedes seguir estas sugerencias para usar la nueva instancia de VisualStudioExtensibility en tu 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

  • Usa la extensión de extensibilidad de VisualStudio.Extensibility con la plantilla de compatibilidad de VSSDK para crear una 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 al agregarlos al constructor de una clase que se instancia mediante inyecció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 plantilla extensión de VisualStudio.Extensibility compatible con VSSDK se encarga de configurar todo el proyecto, resulta útil saber cuáles son los componentes básicos de una extensión VisualStudio.Extensibility compatible con VS-SDK y cómo difiere de la variante común descrita en la guía "crear la 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 la instancia de VisualStudioExtensibility mediante el proveedor de servicios y utilizar sus métodos. Este método permite usar la nueva superficie de API del SDK de VisualStudio.Extensibilit en los 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>
...
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 quieres contribuir a componentes como ventanas de herramientas, agentes de escucha del editor mediante el SDK de VisualStudio.Extensibility dentro de tu extensión VSSDK existente, tendrás que seguir pasos adicionales para crear una instancia de Extension en tu 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 tenga que 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 a su 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 clase base Extension 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.