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.

Erstelle das Projekt

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 Befehl (Community) enthält einen integrierten Befehl, sodass Sie ganz einfach damit 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.

Neues Projektdialogfeld mit VSIX-Projektvorlagen.

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

Konfigurieren Sie Ihr neues Projekt.

Nachdem Sie auf die Schaltfläche "Erstellen" klicken, sollten Sie ein einfaches VSIX-Projekt erhalten, das folgendermaßen aussieht:

Neue Projektdateien und -ordner.

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.

Befehle/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 nach <Group> und <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 Ihre Erweiterung soll sich die Befehlsschaltfläche "GUID einfügen" unter dem Hauptmenü "Bearbeiten" befinden, damit Sie die Gruppe dem Menü "Bearbeiten" erneut zuordnen. Ersetzen Sie "Tools" wie im dargestellten Ausschnitt durch "Bearbeiten":

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

Sie erhalten vollständige IntelliSense-Unterstützung für die Platzierungen, um den richtigen Platz einfach zu finden.

IntelliSense für das übergeordnete VSCT.

Auch die <Button> muss aktualisiert werden. 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 vorangestellt wird und der Punkt nicht angezeigt wird.

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-Symbol 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 die GUID an der Cursorposition des Textpuffers einzufügen. VS ist ein statisches Objekt, das Zugriff auf Visual Studio IDE-UI-Elemente bietet; die Definition in VS.cs im GitHub-Repository des VSIX Community Toolkits anzeigen.

Hinweis

Sie sehen await JoinableTaskFactory.SwitchToMainThreadAsync() und ThreadHelper.ThrowIfNotOnUIThread() an vielen Stellen in diesem Community-Toolkit. Sie befassen sich mit den bewährten Verfahren zum Wechseln von Threads, und es ist nicht notwendig, dass Sie zum jetzigen Zeitpunkt wissen, wann und wie diese anzuwenden sind – Compilerwarnungen mit Codefixes (Hinweissymbole) machen dies sehr 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 angehängtem Debugger zu starten, oder STRG+F5, um ohne Debugger 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 Hauptmenü " Bearbeiten" angezeigt werden.

Befehl

Ö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 Hauptmenü eine Befehlsschaltfläche hinzufügt und beim Ausführen mit dem Text-Editor interagiert.

Glückwunsch!!

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