Creare la prima estensione Visual Studio

Questo documento è una guida introduttiva che illustra come creare la prima estensione usando VisualStudio.Extensibility. L'estensione viene eseguita fuori processo, ossia al di fuori del processo di Visual Studio.

Prerequisites

  • Visual Studio 2026 versione 18.11 o successiva con il carico di lavoro sviluppo di estensioni di Visual Studio è consigliato. Per le versioni precedenti, VisualStudio.Extensibility richiede Visual Studio 2022 versione 17.9 o successiva.

Creare il progetto di estensione

Usare il modello Modern VSIX Project e selezionare VisualStudio.Extensibility (Out-Of-Process) in Tipo di estensione. Per impostazione predefinita, il modello è VSSDK, quindi selezionare l'opzione out-of-process per questa guida introduttiva.

Segui Creare un'estensione con il modello di progetto VSIX moderno per i passaggi della procedura guidata e le opzioni dell'SDK del progetto.

Versioni precedenti di Visual Studio

Usare il modello VisualStudio.Extensibility Project per creare un nuovo progetto di estendibilità.

Schermata del modello VSExtensibility.

A questo punto, si è pronti per iniziare a estendere Visual Studio aggiungendo comandi e componenti dell'editor all'estensione.

La classe Extension

Il modello crea una classe che estende Extension ↗ . Questa classe è la prima di cui viene creata un'istanza quando viene caricata la tua estensione. Nel metodo InitializeServices ↗ è possibile aggiungere servizi personalizzati alla raccolta di servizi per renderli disponibili per l'iniezione delle dipendenze.

[VisualStudioContribution]
internal class ExtensionEntrypoint : Extension
{
    public override ExtensionConfiguration ExtensionConfiguration => new()
    {
        Metadata = new(
            id: "MyExtension.abc123",
            version: this.ExtensionAssemblyVersion,
            publisherName: "My Company",
            displayName: "My Extension"),
    };

    protected override void InitializeServices(IServiceCollection serviceCollection)
    {
        base.InitializeServices(serviceCollection);

        // You can configure dependency injection here by adding services to the serviceCollection.
    }
}

È anche possibile visualizzare l'attributo VisualStudioContribution ↗ usato per contrassegnare i componenti di estensione che devono essere utilizzati da Visual Studio. Questo attributo può essere applicato alle classi che implementano IVisualStudioContributionClass ↗ o proprietà statiche di un tipo che implementa IVisualStudioContributionProperty ↗ .

Aggiungere il primo comando

Il modello crea Command1.cs come primo gestore di comandi, che è possibile usare come punto di partenza. Poiché si vuole rendere Visual Studio consapevole di questo comando e la Command ↗ classe implementa IVisualStudioContributionClass ↗ , il comando è contrassegnato con l'attributo VisualStudioContribution .

[VisualStudioContribution]
internal class Command1 : Command
{

Il comando ha una proprietà di configurazione denominata CommandConfiguration ↗, che definisce il nome visualizzato, l'icona e la posizione nel menu Extensions.

    public override CommandConfiguration CommandConfiguration => new("%MyExtension.Command1.DisplayName%")
    {
        // Use this object initializer to set optional parameters for the command. The required parameter,
        // displayName, is set above. DisplayName is localized and references an entry in .vsextension\string-resources.json.
        Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
    };

Le proprietà di configurazione vengono valutate dal compilatore C# durante la compilazione dell'estensione e i relativi valori vengono salvati come metadati di estensione in modo che Visual Studio possa leggerlo senza caricare l'assembly di estensione. Per questo motivo, le proprietà di configurazione hanno restrizioni aggiuntive rispetto alle proprietà normali, ad esempio devono essere di sola lettura.

È possibile notare che il nome visualizzato del comando è "%MyExtension.Command1.DisplayName%", che fa riferimento alla MyExtension.Command1.DisplayName stringa nel .vsextension/string-resources.json file, consentendo la localizzazione di questa stringa.

Quando viene eseguito il comando, Visual Studio invoca il metodo ExecuteCommandAsync ↗ in cui è possibile posizionare un punto di interruzione. È possibile usare l'argomento context o this.Extensibility per interagire con Visual Studio.

Ad esempio, un gestore di comandi può essere il seguente:

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
    await this.Extensibility.Shell().ShowPromptAsync(
        "Hello from an extension!", 
        PromptOptions.OK, 
        cancellationToken);
}

Per altre informazioni su come aggiungere comandi, vedere la sezione Comandi .

Eseguire il debug dell'estensione

  1. Assicurarsi che il progetto di estensione sia selezionato come progetto di avvio in Visual Studio e premere F5 per avviare il debug.

  2. Premendo F5 compila l'estensione e la distribuisce nell'istanza sperimentale di Visual Studio in uso. Il debugger dovrebbe collegarsi non appena la tua estensione viene caricata.

  3. È possibile trovare il nuovo comando nel Extensions menu come illustrato nell'immagine seguente:

    Screenshot che mostra il comando di esempio in Visual Studio.

    Screenshot che mostra il comando di esempio.

Passaggi successivi