Delen via


Uw eerste Visual Studio-extensie

In dit artikel worden enkele eenvoudige stappen beschreven om uw eerste Visual Studio-extensie actief te maken. Een Visual Studio-extensie wordt geschreven met behulp van .NET Framework en C#. Als u al een .NET-ontwikkelaar bent, zult u merken dat het schrijven van extensies vergelijkbaar is met het schrijven van de meeste andere .NET-programma's en -bibliotheken.

De extensie die u vandaag schrijft, voegt een opdracht toe waarmee een nieuwe guid wordt ingevoegd in de teksteditor wanneer deze wordt uitgevoerd. Het is eenvoudig, nuttig en biedt een goede inleiding tot de verschillende aspecten van uitbreidingsontwikkeling.

Als je een visuele leerling bent, bekijk dan deze korte video van iemand die de handleiding volgt.

Voordat u begint met het schrijven van uw eerste Visual Studio-extensie (het is eenvoudig, beloof ik!), moet u ervoor zorgen dat u over de benodigde hulpprogramma's beschikt.

Het project maken

Er zijn verschillende projectsjablonen waaruit u kunt kiezen, dus u wilt de juiste keuze maken. De sjablonen die in deze community-toolkit worden gebruikt, hebben allemaal de moniker (Community) in de naam.

De VSIX Project w/Command-sjabloon (Community) wordt geleverd met een opdracht die is gekoppeld, zodat u eenvoudig vanaf daar kunt beginnen. Dit is een goed startpunt voor de meeste extensies. Als u weet dat u een hulpprogrammavenster wilt, gebruikt u de sjabloon VSIX Project w/Tool Window (Community). Het bevat ook een opdracht om het taakvenster te openen.

Gebruik de sjablonen Empty VSIX-project (community) of VSIX-project (community) voor exclusief MEF-extensies of andere geavanceerde scenario's.

Deze keer selecteert u de VSIX project-sjabloon met commando (Community), zoals te zien is in de onderstaande schermopname.

Dialoogvenster Nieuw project met VSIX-projectsjablonen.

Nadat u de projectsjabloon hebt geselecteerd, moet u uw project een naam geven. Noem het InsertGuid.

Configureer uw nieuwe project.

Nadat u op de knop Maken hebt geslagen, moet u uiteindelijk een eenvoudig VSIX-project hebben dat er als volgt uitziet:

Nieuwe projectbestanden en -mappen.

Belangrijke bestanden

Laten we de belangrijkste bestanden bekijken.

InsertGuidPackage.cs wordt aangeduid als de pakketklasse. De InitializeAsync(...) methode wordt aangeroepen door Visual Studio om uw extensie te initialiseren. Hier voegt u gebeurtenislisteners toe en registreert u opdrachten, hulpprogrammavensters, instellingen en andere dingen.

source.extension.vsixmanifest is het manifestbestand voor uw extensie. Het bevat metagegevens zoals titel en beschrijving, maar ook informatie over wat de extensie bevat.

VSCommandTable.vsct is een XML-bestand waarin opdrachten en sleutelbindingen declaratief worden gedefinieerd, zodat ze kunnen worden geregistreerd bij Visual Studio.

Commands/MyCommand.cs is de opdrachthandler voor de opdracht die is gedefinieerd in het bestand VSCommandTable.vsct . Het bepaalt wat er gebeurt wanneer de opdracht wordt uitgevoerd door op de knop te klikken.

De opdracht wijzigen

Eerst wilt u ervoor zorgen dat uw opdracht de juiste naam, pictogram en positie heeft in het menusysteem van Visual Studio.

Open het bestand VSCommandTable.vsct en zoek een <Group> en een <Button>. U ziet hoe de knop de groep specificeert als zijn bovenliggend element en hoe het bovenliggende menu van de groep het ingebouwde VSMainMenu/Tools menu is.

Voor uw extensie wilt u dat de knop GUID invoegen zich onder het hoofdmenu Bewerken bevindt, dus u gaat de groep verplaatsen naar het menu Bewerken. Vervang Hulpprogramma's door Bewerken , net zoals in het volgende fragment:

<Group guid="InsertGuid" id="MyMenuGroup" priority="0x0600">
  <Parent guid="VSMainMenu" id="Edit"/>
</Group>

U krijgt volledige IntelliSense voor de plaatsingen, zodat u gemakkelijk de juiste plek kunt vinden.

VSCT-bovenliggende IntelliSense.

Het <Button> moet ook worden bijgewerkt. U geeft het een nieuw pictogram door het id kenmerk van het <Icon> element bij te werken naar PasteAppend. Werk de <ButtonText> tekst bij met een goede, beschrijvende naam en werk de <LocCanonicalName> tekst bij met de technische naam van uw opdracht. Dit is de naam die wordt weergegeven aan gebruikers wanneer ze aangepaste sneltoetsen aan uw opdracht toewijzen in het dialoogvenster Omgevingstoetsenbord > voor extra > opties>.

<Button guid="InsertGuid" id="MyCommand" priority="0x0100" type="Button">
  <Parent guid="InsertGuid" id="MyMenuGroup" />
  <Icon guid="ImageCatalogGuid" id="PasteAppend" />
  <CommandFlag>IconIsMoniker</CommandFlag>
  <Strings>
    <ButtonText>Insert GUID</ButtonText>
    <LocCanonicalName>.Edit.InsertGuid</LocCanonicalName>
  </Strings>
</Button>

Opmerking

Begin <LocCanonicalName> altijd met een puntteken. Er wordt ervoor gezorgd dat er geen andere tekst automatisch vooraf wordt gepend en dat de stip niet wordt weergegeven.

U kunt de duizenden pictogrammen gebruiken die beschikbaar zijn in de afbeeldingsbibliotheek van Visual Studio en zelfs een voorbeeld weergeven in IntelliSense:

VSCT-icoon IntelliSense.

U hebt nu de naam, het pictogram en de locatie van de opdracht bijgewerkt en het is tijd om code te schrijven om de guid in de teksteditor in te voegen.

Open het bestand /Commands/MyCommand.cs en wijzig het om een nieuwe guid in te voegen wanneer het wordt uitgevoerd:

using System;
using Community.VisualStudio.Toolkit;
using EnvDTE;
using Microsoft.VisualStudio.Shell;
using Task = System.Threading.Tasks.Task;

namespace InsertGuid
{
    [Command(PackageIds.MyCommand)]
    internal sealed class MyCommand : BaseCommand<MyCommand>
    {
        protected override async Task ExecuteAsync(OleMenuCmdEventArgs e)
        {
            await Package.JoinableTaskFactory.SwitchToMainThreadAsync();
            DocumentView docView = await VS.Documents.GetActiveDocumentViewAsync();
            if (docView?.TextView == null) return;
            SnapshotPoint position = docView.TextView.Caret.Position.BufferPosition;
            docView.TextBuffer?.Insert(position, Guid.NewGuid().ToString()); 
        }
    }
}

U gebruikt het VS object om de actieve tekstweergave van de editor op te halen en vervolgens de GUID op de caretpositie van de tekstbuffer in te voegen. VS is een statisch object dat toegang biedt tot Visual Studio IDE UI-elementen; zie de definitie in VS.cs in de GitHub-opslagplaats van de VSIX Community Toolkit.

Opmerking

U ziet await JoinableTaskFactory.SwitchToMainThreadAsync() en ThreadHelper.ThrowIfNotOnUIThread() op veel plaatsen in deze community-toolkit. Ze hanteren best practices voor het schakelen van threads, en op dit moment hoeft u niet te weten wanneer en hoe ze te gebruiken - compilerwaarschuwingen met codecorrecties (zichtbare lampjes in de IDE) maken dit heel eenvoudig.

Het eerste concept van onze extensie is nu voltooid en het is tijd om deze te testen.

Uitvoeren en debuggen

Het uitvoeren van uw extensie is net zo eenvoudig als het uitvoeren van een ander .NET-project. Druk gewoon op F5 om te worden uitgevoerd met het foutopsporingsprogramma gekoppeld of Ctrl+F5 voor uitvoering zonder.

Als u dit doet, wordt het experimentele exemplaar van Visual Studio gestart met uw extensie geïnstalleerd. Het experimentele exemplaar is uw reguliere versie van Visual Studio, maar met afzonderlijke instellingen en extensies geïnstalleerd. Het helpt dingen gescheiden te houden.

Wanneer het experimentele exemplaar wordt gestart, ziet u de opdracht GUID invoegen in het hoofdmenu Bewerken .

De GUID-opdracht invoegen in het hoofdmenu Bewerken.

Open een tekstbestand en voer de opdracht uit om een nieuwe guid in te voegen. Dat is het!

Samenvatting

U hebt nu uw eerste extensie gemaakt die een opdrachtknop toevoegt aan het hoofdmenu en communiceert met de teksteditor wanneer deze wordt uitgevoerd.

Gefeliciteerd!!

U vindt de code voor deze extensie in de opslagplaats met voorbeelden.