Delen via


Onderdelen van een VisualStudio.Extensibility-extensie

Een extensie die gebruikmaakt van VisualStudio.Extensibility heeft doorgaans verschillende onderdelen die samenwerken en ook met Visual Studio.

Extensie-instantie

Extensies moeten een klasse hebben die is afgeleid van Extension. Zie MarkdownLintervoor een voorbeeld van een implementatie.

Een exemplaar van de Extension-klasse is het startpunt voor de uitvoering van de extensie. Dit exemplaar bevat de benodigde methoden voor Visual Studio om diensten op te vragen die door de extensie worden geleverd. Het biedt ook virtuele methoden die bedoeld zijn om gelokaliseerde resources en door de extensie beheerde lokale services te leveren, die moeten worden gedeeld tussen de onderdelen van de extensie.

De configuratie voor de Extension-klasse bevat ook de metagegevens voor de extensie die wordt weergegeven in het venster Extensies beheren van Visual Studio en voor gepubliceerde extensies op de Visual Studio Marketplace-.

[VisualStudioContribution]
public class MarkdownLinterExtension : Extension
{
    /// <inheritdoc/>
    public override ExtensionConfiguration ExtensionConfiguration => new()
    {
        Metadata = new(
                id: "MarkdownLinter.0cf26ba2-edd5-4419-8646-a55d0a83f7d8",
                version: this.ExtensionAssemblyVersion,
                publisherName: "Microsoft",
                displayName: "Markdown Linter Sample Extension",
                description: "Sample markdown linter extension"),
    };
    ...

Voor extensieontwikkelaars die bekend zijn met de bestaande VSSDK-API's, wordt de Metadata in ExtensionConfiguration gebruikt om het .vsixmanifest-bestand te genereren. De Extension-klasse is ook vergelijkbaar met de AsyncPackage-klasse die wordt gebruikt in het VSSDK-uitbreidbaarheidsmodel.

VisualStudioExtensibility-object

Het object VisualStudioExtensibility fungeert als het toegangspunt voor uitbreidbaarheidsfuncties die door Visual Studio worden weergegeven. Deze klasse heeft verschillende uitbreidingsmethoden, eigenschappen om snel te inventariseren via beschikbare functies in de UITBREID SDK. Raadpleeg de API-documentatie voor de beschikbare methoden.

Uitbreidingsonderdelen

Voor functies waarbij een extensie onderdelen bijdraagt aan Visual Studio, zoals opdrachten, editorlisteners, zullen extensies gebruikmaken van toegewezen klassen. Het buildproces genereert de juiste metagegevens om ervoor te zorgen dat deze onderdelen kunnen worden gedetecteerd door Visual Studio.

Voor functies waarbij een extensie onderdelen bijdraagt aan Visual Studio, zoals opdrachten, editorlisteners, hulpprogrammavensters, enzovoort, maken extensies gebruik van klassen die zijn gemarkeerd met het kenmerk VisualStudioContribution. Het buildproces genereert de juiste metagegevens om ervoor te zorgen dat deze onderdelen kunnen worden gedetecteerd door Visual Studio.

Momenteel ondersteunt de SDK een beperkte set onderdelen die moeten worden bijgedragen:

Exemplaren voor deze klassen worden gemaakt als onderdeel van het uitbreidbaarheidsframework dat door de SDK wordt geleverd met behulp van een afhankelijkheidsinjectiebibliotheek en constructors kunnen worden gebruikt om instanties van services op te halen die worden geleverd door de SDK of door de extensie zelf om de status te delen tussen onderdelen.

Levensduur van verlengstukken

De levensduur van elk onderdeel wordt beheerd door het respectieve onderdeel waarmee deze onderdelen in het Visual Studio IDE-proces worden geladen.

  • Opdrachthandlers worden geïnitialiseerd wanneer de bijbehorende opdrachtenset wordt geactiveerd. Dit kan gebeuren tijdens de eerste uitvoering van de opdracht. Zodra deze is geactiveerd, mogen opdrachthandlers alleen worden verwijderd wanneer IDE wordt afgesloten.

  • Op dezelfde manier worden gebeurtenislisteners voor tekstweergaven geïnitialiseerd wanneer de eerste tekstweergave die overeenkomt met het opgegeven inhoudstype in de IDE wordt geladen. Dergelijke listeners zijn momenteel actief totdat IDE wordt afgesloten, maar dit gedrag kan in de toekomst veranderen.

Over het algemeen raden we voor complexe extensies aan dat extensies lokale services bieden die onderdelen in hun constructor kunnen importeren en die services kunnen gebruiken om de status te delen tussen onderdelen en over exemplaren van hetzelfde onderdeel. Deze procedure zorgt ervoor dat de uitbreidingsstatus niet wordt beïnvloed door levensduurwijzigingen van extensieonderdelen.

Services geleverd door SDK voor injectie- en lokale extensieservices

VisualStudio.Extensibility SDK maakt gebruik van afhankelijkheidsinjectie, zodat onderdelen zowel ingebouwde als lokaal door de extensie aangeboden services kunnen gebruiken en delen tussen verschillende onderdelen. Raadpleeg sectie over afhankelijkheidsinjectie voor meer informatie over services die worden aangeboden door de SDK, levensduur van de service en voorbeelden van gebruiksvoorbeelden van afhankelijkheidsinjectie.

Zie MarkdownLinter-extensievoor een voorbeeld van hoe lokale services worden gebruikt.

Clientcontext

Omdat alle extensies in de nieuwe SDK buiten het proces worden uitgevoerd, introduceren we het concept van clientcontext voor verschillende extensieonderdelen om de status van de IDE weer te geven op het moment dat de gebeurtenis of methode wordt aangeroepen. Deze context wordt vertegenwoordigd door het IClientContext exemplaar in de SDK en wordt doorgegeven aan verschillende bewerkingen, zoals handlers voor opdrachtuitvoering. De SDK biedt uitbreidingsmethoden op IClientContext die kunnen worden gebruikt om objecten op te halen uit de context. Extensies kunnen bijvoorbeeld de actieve tekstweergave of de URI voor de geselecteerde items ophalen op het moment dat de opdracht wordt uitgevoerd met behulp van het IClientContext exemplaar.

Met sommige onderdelen, zoals opdrachten, kunt u ook declareren in welke context ze geïnteresseerd zijn. Dit wordt gedaan om de hoeveelheid gegevens te optimaliseren die in elke externe uitvoering wordt overgedragen, omdat de clientcontext in de toekomst groot kan worden. In de eerste preview zijn er slechts twee beschikbare contexten, Shell en Editor, en beide zijn standaard opgenomen bij het declareren van een opdracht met behulp van CommandAttribute.