Freigeben über


Ihre erste Visual Studio-Erweiterung

Dieser Artikel führt Sie durch einige einfache Schritte, um Ihre erste Visual Studio-Erweiterung auf dem Laufenden zu halten. Eine Visual Studio-Erweiterung wird mit .NET Framework und C# geschrieben. Wenn Sie bereits .NET-Entwickler sind, werden Sie feststellen, dass das Schreiben von Erweiterungen mit dem Schreiben der meisten anderen .NET-Programme und -Bibliotheken vergleichbar ist.

Die Erweiterung, die Sie heute schreiben, fügt einen Befehl hinzu, der beim Ausführen eine neue GUID in den Text-Editor einfügt. Es ist einfach, nützlich und bietet eine gute Einführung in die verschiedenen Aspekte der Erweiterungsentwicklung.

Wenn Sie ein visueller Lerner sind, schauen Sie sich dieses kurze Video einer Person an, die dem Lernprogramm folgt.

Bevor Sie mit dem Schreiben Ihrer ersten Visual Studio-Erweiterung beginnen (es ist einfach, ich verspreche!), stellen Sie sicher, dass Sie über die erforderlichen Tools verfügen.

Erstellen des Projekts

Es gibt mehrere Projektvorlagen, aus denen Sie auswählen können, sodass Sie die richtige Wahl treffen möchten. Die vorlagen, die in diesem Community-Toolkit verwendet werden, haben alle den Moniker (Community) im Namen.

Die VSIX-Projektvorlage mit dem Befehl "Community" ist mit einem integrierten Befehl versehen, sodass sie ganz einfach von dort aus beginnen können. Dies ist ein guter Ausgangspunkt für die meisten Erweiterungen. Wenn Sie wissen, dass Sie ein Toolfenster verwenden möchten, verwenden Sie die VSIX-Projektvorlage w/Tool Window (Community).If you know you want a tool window, use the VSIX Project w/Tool Window (Community) template. Außerdem verfügt es über einen Befehl zum Öffnen des Toolfensters.

Verwenden Sie die Vorlagen für leere VSIX-Projekte (Community) oder VSIX Project (Community) für nur MEF-Erweiterungen oder andere erweiterte Szenarien.

Dieses Mal wählen Sie die VSIX-Projektvorlage mit Befehl (Community) aus, wie im folgenden Screenshot gezeigt.

New Project Dialog showing VSIX project templates.

Nachdem Sie die Projektvorlage ausgewählt haben, müssen Sie Ihrem Projekt einen Namen geben. Nennen Sie sie InsertGuid.

Configure your new project.

Nachdem Sie auf die Schaltfläche "Erstellen " klicken, sollten Sie ein einfaches VSIX-Projekt wie folgt aussehen:

New project files and folders.

Wichtige Dateien

Schauen wir uns die wichtigsten Dateien an.

InsertGuidPackage.cs wird als Package-Klasse bezeichnet. Die InitializeAsync(...) Methode wird von Visual Studio aufgerufen, um die Erweiterung zu initialisieren. Hier fügen Sie Ereignislistener hinzu und registrieren Befehle, Toolfenster, Einstellungen und andere Dinge.

source.extension.vsixmanifest ist die Manifestdatei für Die Erweiterung. Sie enthält Metadaten wie Titel und Beschreibung, aber auch Informationen dazu, was die Erweiterung enthält.

VSCommandTable.vsct ist eine XML-Datei, in der Befehle und Tastenbindungen deklarativ definiert werden, sodass sie mit Visual Studio registriert werden können.

Commands/MyCommand.cs ist der Befehlshandler für den befehl, der in der Datei VSCommandTable.vsct definiert ist. Sie steuert, was geschieht, wenn der Befehl durch Klicken auf die Schaltfläche ausgeführt wird.

Ändern des Befehls

Zuerst möchten Sie sicherstellen, dass Ihr Befehl den richtigen Namen, das richtige Symbol und die Position im Visual Studio-Menüsystem aufweist.

Öffnen Sie die Datei VSCommandTable.vsct , und suchen Sie eine <Group> und eine <Button>. Beachten Sie, wie die Schaltfläche die Gruppe als übergeordnetes Element angibt, und das übergeordnete Element der Gruppe ist das integrierte VSMainMenu/Tools-Menü.

Für Die Erweiterung soll die Befehlsschaltfläche "GUID einfügen" im Menü "Bearbeiten" Standard angezeigt werden, sodass Sie die Gruppe erneut zum Menü "Bearbeiten" übergehen. Ersetzen Sie "Tools " wie im folgenden Codeausschnitt durch "Bearbeiten" :

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

Sie erhalten voll IntelliSense für die Platzierungen, um die richtige Stelle zu finden.

VSCT parent IntelliSense.

Die <Button> Anforderungen werden ebenfalls aktualisiert. Sie erhalten ein neues Symbol, indem Sie das id Attribut des <Icon> Elements auf "PasteAppend" aktualisieren. Aktualisieren Sie den <ButtonText> Text mit einem guten, beschreibenden Namen, und aktualisieren Sie den <LocCanonicalName> mit dem technischen Namen Ihres Befehls . Dies ist der Name, der Benutzern angezeigt wird, wenn sie Ihrem Befehl im Dialogfeld "Optionen > >: Umgebungstastatur>" benutzerdefinierte Tastenkombinationen zuweisen.

<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>

Hinweis

Beginnen Sie immer <LocCanonicalName> mit einem Punktzeichen. Es stellt sicher, dass kein anderer Text automatisch vorgestiftet wird, und der Punkt wird nicht angezeigt.

Sie können die Tausenden von Symbolen verwenden, die in der Bildbibliothek von Visual Studio verfügbar sind, und sogar eine Vorschau in IntelliSense anzeigen:

VSCT icon IntelliSense.

Jetzt haben Sie den Namen, das Symbol und die Position unseres Befehls aktualisiert, und es ist an der Zeit, Code zu schreiben, um die GUID in den Text-Editor einzufügen.

Öffnen Sie die Datei "/Commands/MyCommand.cs ", und ändern Sie sie, um eine neue GUID einzufügen, wenn sie ausgeführt wird:

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()); 
        }
    }
}

Sie verwenden das VS Objekt, um die textansicht des aktiven Editors abzurufen, und fügen Sie dann die GUID an der Caretposition des Textpuffers ein.

Hinweis

Sie sehen await JoinableTaskFactory.SwitchToMainThreadAsync() und ThreadHelper.ThrowIfNotOnUIThread() an vielen Stellen in diesem Community-Toolkit. Sie behandeln bewährte Methoden zum Wechseln von Threads, und Sie müssen nicht wissen, wann und wie sie zu diesem Zeitpunkt verwendet werden . Compilerwarnungen mit Codefixes (Glühbirnen) machen dies super einfach.

Der erste Entwurf unserer Erweiterung ist jetzt abgeschlossen und es ist an der Zeit, sie zu testen.

Ausführen und Debuggen

Das Ausführen der Erweiterung ist so einfach wie das Ausführen eines anderen .NET-Projekts. Drücken Sie einfach F5 , um mit dem debugger angefügt oder STRG+F5 ohne Ausführung auszuführen.

Auf diese Weise wird die experimentelle Instanz von Visual Studio mit der installierten Erweiterung gestartet. Die experimentelle Instanz ist Ihre reguläre Version von Visual Studio, aber mit separaten Einstellungen und Erweiterungen installiert. Sie hilft dabei, die Dinge voneinander getrennt zu halten.

Wenn die experimentelle Instanz gestartet wird, sollte der Befehl "GUID einfügen" im Menü "Standard bearbeiten" angezeigt werden.

Insert GUID command located in the Edit main menu.

Öffnen Sie eine beliebige Textdatei, und führen Sie den Befehl aus, um eine neue GUID einzufügen. Das ist alles!

Zusammenfassung

Sie haben nun Ihre erste Erweiterung erstellt, die dem Menü Standard eine Befehlsschaltfläche hinzufügt und beim Ausführen mit dem Text-Editor interagiert.

Herzlichen glückwunsch!!

Sie finden den Code für diese Erweiterung im Beispiel-Repository.