Uso di VisualStudio.Extensibility SDK e VSSDK insieme

Anche se il modello VisualStudio.Extensibility è stato creato principalmente per ospitare estensioni al di fuori del processo di devenv.exe, è possibile usare le API di VisualStudio.Extensibility SDK in un'estensione in esecuzione nel processo di Visual Studio e usando le API di estendibilità tradizionali fornite dai pacchetti Microsoft.VisualStudio.Sdk .

Il supporto dell'utilizzo in-proc è progettato per consentire agli early adopter di accedere alle nuove API di VisualStudio.Extensibility, basandosi su Microsoft.VisualStudio.Sdk per coprire eventuali gap di funzionalità.

Questo documento è una procedura dettagliata rapida su diverse opzioni per l'uso di VisualStudio.Extensibility SDK in-proc.

  • Se si sta sviluppando una nuova estensione, il metodo consigliato consiste nel creare un oggetto VisualStudio.Extension ospitato in-process seguendo questa esercitazione. Questo metodo consente di usare le funzionalità complete di VisualStudio.Extensibility SDK oltre a poter inserire servizi VSSDK e MEF.

  • Se si dispone di un'estensione VSSDK esistente, è possibile seguire questi suggerimenti per usare la nuova istanza di VisualStudioExtensibility nell'estensione.

  • Per aggiungere comandi, visualizzatori di debug, finestre degli strumenti all'estensione VSSDK esistente usando VisualStudio.Extensibility SDK, è possibile fare riferimento a questi suggerimenti per ospitare sia un'estensione VSSDK che un'estensione VisualStudio.Extensibility nello stesso progetto di estensione di Visual Studio.

Creare la prima estensione VisualStudio.Extensibility compatibile con VSSDK

Anche se il modello VisualStudio.Extensibility è stato creato principalmente per ospitare estensioni esterne al processo di devenv.exe, a partire da Visual Studio 2022 17.4 Preview 1 è possibile compilare un'estensione VisualStudio.Extensibility ospitata all'interno di devenv.exe e può usare le API di estendibilità tradizionali fornite dai pacchetti Microsoft.VisualStudio.Sdk .

Prerequisiti

  • Visual Studio 2022 versione 17.9 Preview 1 o successiva con il Visual Studio extension development carico di lavoro.
  • Se si esegue l'aggiornamento da build precedenti, assicurarsi di disinstallare VisualStudio.Extensibility Project System per evitare potenziali conflitti.

Creare un progetto di estensione

  • Usare il modello visualStudio.Extensibility Extension with VS SDK Compatibility (Estensione VisualStudio.Extensibility con VS SDK Compatibility ) per creare una nuova soluzione.

Screenshot of the VisualStudio.Extensibility in-process extension project template.

Eseguire il debug dell'estensione

  • Impostare Il progetto Contenitore come Progetto di avvio, premere F5 per avviare il debug.

  • Premendo F5 si compila l'estensione e la si distribuisce nell'istanza sperimentale della versione di Visual Studio in uso. Il debugger deve essere collegato dopo il caricamento dell'estensione.

  • È possibile trovare il comando nel Extensions menu come illustrato nell'immagine seguente:

    Screenshot showing sample extension command.

Utilizzo di servizi Visual Studio SDK da un'estensione VisualStudio.Extensibility

Un progetto di estensione compatibile con VS-SDK fa riferimento al pacchetto Microsoft.VisualStudio.Sdk , che consente l'accesso a tutti i servizi di Visual Studio SDK.

Tradizionalmente, tali servizi vengono utilizzati tramite MEF o AsyncServiceProvider. Un extender di VisualStudio.Extensibility è invece incoraggiato all'inserimento delle dipendenze .NET.

Le MefInjection<TService> classi e AsyncServiceProviderInjection<TService, TInterface> (entrambi dello spazio dei Microsoft.VisualStudio.Extensibility.VSSdkCompatibility nomi) consentono di utilizzare i servizi di Visual Studio SDK aggiungendoli al costruttore di una classe di cui viene creata un'istanza tramite l'inserimento delle dipendenze (ad esempio un comando, una finestra degli strumenti o una parte di estensione).

Nell'esempio seguente viene illustrato come aggiungere i DTE2 servizi e 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),
        };

Anatomia di un'estensione VisualStudio.Extensibility compatibile con VSSDK

Anche se si usa il modello visualStudio.Extensibility Extension with VS SDK Compatibility (Estensione VisualStudio.Extensibility con VS SDK) si occupa della configurazione dell'intera soluzione, è utile sapere quali sono i componenti di base di un'estensione VisualStudio.Extensibility compatibile con VISUALStudio.Extensibility e il modo in cui differisce dalla variante comune descritta nella guida "Creare la prima estensione".

Progetto contenitore

Una soluzione VisualStudio.Extensibility compatibile con VS-SDK è costituita da due progetti:

  1. una libreria di classi che fa riferimento sia ai pacchetti VisualStudio.Extensibility che a Visual Studio SDK e contiene tutto il codice dell'estensione,
  2. un progetto VSIX contenitore usato per distribuire ed eseguire il debug dell'estensione.

Questa separazione è una soluzione temporanea mentre VisualStudio.Extensibility è in anteprima e la progettazione finale della creazione di pacchetti e distribuzione è in fase di finalizzazione.

L'extender non deve aggiungere codice, contenuto o risorse al progetto contenitore. L'unico obiettivo del progetto contenitore è includere gli asset forniti dall'altro progetto.

TargetFramework

Sia il progetto di estensione che il progetto contenitore devono essere destinati alla versione .NET usata dalla versione di Visual Studio di destinazione. Per Visual Studio 2022, devono essere destinati a .NET Framework 4.7.2.

RequiresInProcessHosting - proprietà

La Extension classe deve essere configurata con la RequiresInProcessHosting = true proprietà che identifica l'estensione come in-process.

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

    ...

Usare VisualStudio.Extensibility da estensioni VSSDK esistenti

Per le estensioni VSSDK esistenti, un'altra opzione consiste nell'eseguire una query per l'istanza di VisualStudioExtensibility tramite il provider di servizi e usare i relativi metodi. Questo metodo consente di usare la nuova area di attacco API di VisualStudio.Extensibility SDK nei componenti esistenti. Questa opzione può essere utile nelle situazioni in cui si vuole usare la nuova API per eseguire query sulle informazioni sul progetto, sulla gestione dei documenti senza creare una nuova estensione basata su VisualStudio.Extensibility.

Ecco un frammento di codice di esempio che mostra come usarlo VisualStudioExtensibility all'interno di un pacchetto VSSDK:

  • .csproj Nel file includere un riferimento al pacchetto alle API VisualStudio.Extensibility:
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.23-preview-1" />
  </ItemGroup>
  • È ora possibile eseguire una query per l'istanza di VisualStudioExtensibility tramite GetServiceAsync il metodo nel pacchetto o in altri componenti:
...
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);
        ...
    }
}

Aggiungere un'estensione VisualStudio.Extensibility a un progetto di estensione VSSDK esistente

Se si vuole anche contribuire a componenti come le finestre degli strumenti, i listener dell'editor usando VisualStudio.Extensibility SDK all'interno dell'estensione VSSDK esistente, è necessario seguire i passaggi aggiuntivi per creare un'istanza dell'estensione VisualStudio.Extensibility nel progetto.

  • Per usare i pacchetti VisualStudio.Extensibility SDK, è necessario uno stile .csproj SDK. Per i progetti esistenti, potrebbe essere necessario aggiornare in .csproj uno stile SDK.

  • Rimuovere il riferimento al pacchetto per Microsoft.VSSDK.BuildTools e aggiungere invece riferimenti ai pacchetti per VisualStudio.Extensibility.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.23-preview-1" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.23-preview-1" />
  • Aggiungere VssdkCompatibleExtension la proprietà al file di progetto impostandola su true. Questa proprietà abiliterà alcune funzionalità di VSSDK per la compatibilità.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    

È ora possibile usare tutte le funzionalità di VisualStudio.Extensibility insieme all'estensione VSSDK esistente.