Składniki rozszerzenia VisualStudio.Extensibility

Rozszerzenie korzystające z rozszerzenia VisualStudio.Extensibility zwykle zawiera kilka składników, które współdziałają ze sobą, a także z programem Visual Studio.

Wystąpienie rozszerzenia

Rozszerzenia muszą mieć klasę pochodzącą z klasy Extension. Aby zapoznać się z przykładową implementacją, zobacz MarkdownLinter.

Wystąpienie Extension klasy jest punktem wyjścia do wykonania rozszerzenia. To wystąpienie zawiera niezbędne metody, aby program Visual Studio wysyłał zapytania o usługi udostępniane przez rozszerzenie. Udostępnia również metody wirtualne rozszerzenia w celu zapewnienia zlokalizowanych zasobów i usług lokalnych należących do rozszerzenia, które mają być współużytkowane przez składniki rozszerzenia.

Konfiguracja Extension klasy zawiera również metadane rozszerzenia, które jest wyświetlane w oknie Zarządzanie rozszerzeniami programu Visual Studio i dla opublikowanych rozszerzeń w witrynie 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"),
    };
    ...

W przypadku deweloperów rozszerzeń, którzy znają istniejące interfejsy API zestawu VS SDK, Metadata element zawarty w ExtensionConfiguration pliku jest używany do generowania .vsixmanifest pliku. Ponadto klasa jest podobna Extension do AsyncPackage klasy używanej w modelu rozszerzalności zestawu VS SDK.

Obiekt VisualStudioExtensibility

Obiekt VisualStudioExtensibility działa jako punkt wejścia dla funkcji rozszerzalności uwidocznionych przez program Visual Studio. Ta klasa ma różne metody rozszerzenia, właściwości umożliwiające szybkie wyliczanie dostępnych funkcji w zestawie SDK rozszerzalności. Zapoznaj się z dokumentacją interfejsu API, aby zapoznać się z dostępnymi metodami.

Części rozszerzeń

W przypadku funkcji, w których rozszerzenie współtworzy składniki programu Visual Studio, takie jak polecenia, odbiorniki edytora, rozszerzenia będą korzystać z klas atrybutów. Proces kompilacji wygeneruje poprawne metadane, aby upewnić się, że te składniki można odnaleźć w programie Visual Studio.

W przypadku funkcji, w których rozszerzenie współtworzy składniki programu Visual Studio, takie jak polecenia, odbiorniki edytora, okna narzędzi itp., rozszerzenia wykorzystują klasy oznaczone atrybutem VisualStudioContribution . Proces kompilacji generuje poprawne metadane, aby upewnić się, że te składniki można odnaleźć w programie Visual Studio.

Obecnie zestaw SDK obsługuje ograniczony zestaw składników, które mają zostać dodane:

Wystąpienia dla tych klas są tworzone w ramach struktury rozszerzalności udostępnianej przez zestaw SDK przy użyciu biblioteki iniekcji zależności, a konstruktory mogą służyć do pobierania wystąpień usług dostarczanych przez zestaw SDK lub przez samo rozszerzenie do udostępniania stanu między składnikami.

Okres istnienia części rozszerzeń

Okres istnienia każdej części jest zarządzany przez odpowiedni składnik, który ładuje te części w procesie IDE programu Visual Studio.

  • Programy obsługi poleceń są inicjowane po aktywowaniu odpowiedniego zestawu poleceń, który może być podczas pierwszego wykonywania polecenia. Po aktywowaniu programy obsługi poleceń powinny być usuwane tylko po zamknięciu środowiska IDE.

  • Podobnie odbiorniki zdarzeń widoku tekstu są inicjowane, gdy pierwszy widok tekstowy zgodny z określonym typem zawartości jest ładowany w środowisku IDE. Obecnie takie odbiorniki są aktywne do momentu zamknięcia środowiska IDE, ale to zachowanie może ulec zmianie w przyszłości.

Ogólnie rzecz biorąc, w przypadku złożonych rozszerzeń zalecamy, aby rozszerzenia świadczyły usługi lokalne, które części mogą importować w konstruktorze i używać tych usług do współużytkowania stanu między częściami i między wystąpieniami tej samej części. Ta praktyka zapewnia, że stan rozszerzenia nie ma wpływu na zmiany okresu istnienia części rozszerzeń.

Usługi udostępniane przez zestaw SDK do wstrzykiwania

Następujące usługi są udostępniane przez zestaw SDK, który może być używany w konstruktorze dla dowolnej części rozszerzenia:

  • VisualStudioExtensibility: każda część rozszerzenia może wstrzyknąć wystąpienie VisualStudioExtensibility programu w celu interakcji ze środowiskiem IDE programu Visual Studio.

  • Extension: Części mogą wstrzykiwać Microsoft.VisualStudio.Extensibility.Extension typ lub rozszerzenia własnego typu dziedziczone z niego do części rozszerzeń.

  • TraceSource: Wystąpienie źródła śledzenia jest tworzone na żądanie dla każdego rozszerzenia, które może służyć do rejestrowania informacji diagnostycznych. Te wystąpienia są rejestrowane u dostawcy diagnostyki programu Visual Studio, który może służyć do scalania dzienników z wielu usług i korzystania z przyszłych narzędzi w celu uzyskania dostępu do rejestrowania w czasie rzeczywistym. Zobacz Rejestrowanie.

  • Usługi lokalne: wszystkie usługi lokalne udostępniane przez samo rozszerzenie będą również dostępne do wstrzykiwania zależności.

  • MefInjection<TService> i AsyncServiceProviderInjection<TService, TInterface>: Rozszerzenia in-proc mogą wstrzyknąć usługi Zestawu SDK programu Visual Studio, które będą tradycyjnie używane za pośrednictwem meF lub AsyncServiceProvider.

Lokalne usługi rozszerzeń

W niektórych scenariuszach rozszerzenie może chcieć współużytkować stan między różnymi składnikami, takimi jak program obsługi poleceń i odbiornik zmian widoku tekstu, jak widać na MarkdownLinter przykład. Te usługi można dodać do kolekcji usług przetwarzania przez zastąpienie Extension.InitializeServices metody i w miarę tworzenia wystąpień części rozszerzeń, usługi są wstrzykiwane na podstawie argumentów konstruktora.

Istnieją trzy opcje dodawania usługi:

  • AddTransient: nowe wystąpienie usługi jest tworzone dla każdej części, która ją pozyska.
  • AddScoped: Nowe wystąpienie usługi jest tworzone w określonym zakresie. W kontekście rozszerzalności programu Visual Studio zakres odnosi się do jednej części rozszerzenia.
  • AddSingleton: Istnieje jedno udostępnione wystąpienie usługi, które jest tworzone podczas pierwszego pozyskiwania.

Ze względu na okres istnienia VisualStudioExtensibility obiektu powiązanego z zakresem pojedynczej części rozszerzenia każda usługa lokalna, która pozyska go, musi być usługą o określonym zakresie lub przejściowym. Próba utworzenia pojedynczej usługi, która wprowadza, VisualStudioExtensibility spowoduje niepowodzenie.

Aby zapoznać się z przykładem sposobu użycia usług lokalnych, zobacz Rozszerzenie MarkdownLinter.

Kontekst klienta

Ponieważ wszystkie rozszerzenia w nowym zestawie SDK kończy się procesem, wprowadzamy koncepcję kontekstu klienta dla różnych części rozszerzeń reprezentujących stan środowiska IDE w momencie wywołania zdarzenia lub metody. Ten kontekst jest reprezentowany IClientContext przez wystąpienie w zestawie SDK i jest przekazywany do różnych operacji, takich jak programy obsługi wykonywania poleceń. Zestaw SDK udostępnia metody rozszerzeń, IClientContext których można używać do pobierania obiektów z kontekstu. Na przykład rozszerzenia mogą uzyskać aktywny widok tekstowy lub identyfikator URI dla wybranych elementów w momencie wykonywania polecenia przy użyciu IClientContext wystąpienia.

Niektóre składniki, takie jak polecenia, umożliwiają również zadeklarowanie, które konteksty są zainteresowane. Jest to wykonywane w celu zoptymalizowania ilości danych przesyłanych w każdym zdalnym wykonaniu, ponieważ kontekst klienta może być duży w przyszłości. W początkowej wersji zapoznawczej dostępne są tylko dwa dostępne konteksty, Shell a Editoroba są domyślnie uwzględniane podczas deklarowania polecenia przy użyciu polecenia CommandAttribute.