VisualStudio.Genişletilebilirlik uzantısının bileşenleri

VisualStudio.Genişletilebilirlik kullanan bir uzantı genellikle Visual Studio ile birlikte ve aynı zamanda etkileşim kuran birkaç bileşene sahiptir.

Uzantı örneği

Uzantılar, öğesinden Extensiontüretilen bir sınıfa sahip olmalıdır. Örnek bir uygulama için bkz . MarkdownLinter.

sınıfının bir örneği Extension , uzantının yürütülmesi için başlangıç noktasıdır. Bu örnek, Visual Studio'da uzantı tarafından sağlanan hizmetleri sorgulamak için gerekli yöntemleri içerir. Ayrıca uzantının bileşenleri arasında paylaşılacak yerelleştirilmiş kaynaklar ve uzantıya ait yerel hizmetler sağlamak için sanal yöntemler sağlar.

Sınıfın Extension yapılandırması, Visual Studio Uzantıları Yönet penceresinde ve yayımlanmış uzantılar için Visual Studio Market'te gösterilen uzantının meta verilerini de içerir.

[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"),
    };
    ...

Mevcut VS SDK API'lerini bilen uzantı geliştiricileri için dosyasını MetadataExtensionConfiguration oluşturmak .vsixmanifest için içindekiler kullanılır. Ayrıca, Extension sınıfı VS SDK genişletilebilirlik modelinde kullanılan sınıfa benzer AsyncPackage .

VisualStudioExtensibility nesnesi

nesnesi VisualStudioExtensibility , Visual Studio tarafından kullanıma sunulan genişletilebilirlik özellikleri için giriş noktası işlevi görür. Bu sınıf, genişletilebilirlik SDK'sında kullanılabilir özellikleri hızla listelemek için çeşitli uzantı yöntemlerine, özelliklere sahiptir. Kullanılabilir yöntemler için API belgelerine bakın.

Uzantı parçaları

Uzantının Visual Studio'ya komutlar, düzenleyici dinleyicileri gibi bileşenlere katkıda bulunduğu özellikler için uzantılar öznitelikli sınıfları kullanır. Derleme işlemi, bu bileşenlerin Visual Studio tarafından bulunabilmesini sağlamak için doğru meta verileri oluşturur.

Uzantının Visual Studio'ya komutlar, düzenleyici dinleyicileri, araç pencereleri gibi bileşenlere katkıda bulunduğu özellikler için uzantılar özniteliğiyle VisualStudioContribution işaretlenmiş sınıfları kullanır. Derleme işlemi, bu bileşenlerin Visual Studio tarafından bulunabilmesini sağlamak için doğru meta verileri oluşturur.

SDK şu anda katkıda bulunılması gereken sınırlı bir bileşen kümesini destekler:

Bu sınıfların örnekleri, bağımlılık ekleme kitaplığı kullanılarak SDK tarafından sağlanan genişletilebilirlik çerçevesinin bir parçası olarak oluşturulur ve oluşturucular, SDK veya uzantı tarafından sağlanan hizmet örneklerini bileşenler arasında paylaşmak üzere almak için kullanılabilir.

Uzantı parçalarının kullanım ömrü

Her bölümün ömrü, bu bölümleri Visual Studio IDE işlemi içinde yükleyen ilgili bileşen tarafından yönetilir.

  • Komut işleyicileri, ilgili komut kümesi etkinleştirildiğinde başlatılır ve bu, komutun ilk yürütülmesi sırasında olabilir. Etkinleştirildikten sonra, komut işleyicileri yalnızca IDE kapatıldığında atılmalıdır.

  • Benzer şekilde metin görünümü olay dinleyicileri, belirtilen içerik türüyle eşleşen ilk metin görünümü IDE'ye yüklendiğinde başlatılır. Şu anda, bu tür dinleyiciler IDE kapatılıncaya kadar etkindir, ancak bu davranış gelecekte değişebilir.

Genel olarak, karmaşık uzantılar için uzantıların parçaların oluşturucusunda içeri aktarabileceği yerel hizmetler sağlamasını ve bu hizmetleri kullanarak bölümler arasında ve aynı bölümün örnekleri arasında durum paylaşmasını öneririz. Bu uygulama, uzantı bölümlerinin yaşam süresi değişikliklerinden uzantı durumunun etkilenmemesini sağlar.

SDK tarafından ekleme için sağlanan hizmetler

Aşağıdaki hizmetler, sdk tarafından herhangi bir uzantı parçası için oluşturucuda kullanılabilecek şekilde sağlanır:

  • VisualStudioExtensibility: Her uzantı bölümü, Visual Studio IDE ile etkileşime geçmek için öğesinin VisualStudioExtensibility bir örneğini ekleyebilir.

  • Extension: Parçalar türü ekleyebilir Microsoft.VisualStudio.Extensibility.Extension veya uzantılardan uzantı bölümlerine devralan kendi türüne sahip olabilir.

  • TraceSource: Tanılama bilgilerini kaydetmek için kullanılabilecek her uzantı için isteğe bağlı olarak bir izleme kaynağı örneği oluşturulur. Bu örnekler, birden çok hizmetten günlükleri birleştirmek ve gerçek zamanlı günlüğe erişmek için gelecekteki araçları kullanmak için kullanılabilen Visual Studio tanılama sağlayıcısına kaydedilir. Bkz. Günlük.

  • Yerel hizmetler: Uzantının kendisi tarafından sağlanan tüm yerel hizmetler bağımlılık ekleme için de kullanılabilir.

  • MefInjection<TService>ve AsyncServiceProviderInjection<TService, TInterface>: Proc içi uzantılar, geleneksel olarak MEF veya AsyncServiceProvider aracılığıyla kullanılacak Visual Studio SDK hizmetlerini ekleyebilir.

Yerel uzantı hizmetleri

Bazı senaryolarda bir uzantı, örneğinde görüldüğü MarkdownLinter gibi, komut işleyicisi ve metin görünümü değişiklik dinleyicisi gibi farklı bileşenler arasında durum paylaşmak isteyebilir. Bu hizmetler, yöntem geçersiz kılınarak Extension.InitializeServices işlem içi hizmet koleksiyonuna eklenebilir ve uzantı parçalarının örnekleri oluşturulduktan sonra, hizmetler oluşturucu bağımsız değişkenlerine göre eklenir.

Hizmet eklemek için üç seçenek vardır:

  • AddTransient: Hizmeti alan her bölüm için yeni bir hizmet örneği oluşturulur.
  • AddScoped: Hizmetin yeni bir örneği belirli bir kapsam içinde oluşturulur. Visual Studio genişletilebilirliği bağlamında kapsam, tek bir uzantı bölümüne başvurur.
  • AddSingleton: İlk alımda oluşturulan tek bir paylaşılan hizmet örneği vardır.

Nesnenin VisualStudioExtensibility ömrü tek bir uzantı parçasının kapsamına bağlı olduğundan, onu alan tüm yerel hizmetler kapsamlı veya geçici bir hizmet olmalıdır. Eklenen VisualStudioExtensibility tekil bir hizmet oluşturmaya çalışmak hataya neden olur.

Yerel hizmetlerin nasıl kullanıldığına ilişkin bir örnek için bkz . MarkdownLinter uzantısı.

İstemci bağlamı

Yeni SDK'daki tüm uzantılar işlem dışı olduğundan, olay veya yöntem çağrıldığında IDE'nin durumunu temsil eden çeşitli uzantı bölümleri için istemci bağlamı kavramını kullanıma sunacağız. Bu bağlam, SDK'daki örnek tarafından IClientContext temsil edilir ve komut yürütme işleyicileri gibi çeşitli işlemlere geçirilir. SDK, bağlamdaki IClientContext nesneleri almak için kullanılabilecek uzantı yöntemleri sağlar. Örneğin uzantılar, örneği kullanarak komut yürütme sırasında seçili öğelerin etkin metin görünümünü veya URI'sini IClientContext alabilir.

Komutlar gibi bazı bileşenler, hangi bağlamlarla ilgilendiklerini bildirmenize de olanak sağlar. Bu, istemci bağlamı gelecekte genişleyebileceğinden, her uzaktan yürütmede aktarılan veri miktarını iyileştirmek için yapılır. İlk önizlemede yalnızca iki kullanılabilir bağlam Shell vardır ve Editorher ikisi de kullanılarak CommandAttributebir komut bildirilirken varsayılan olarak eklenir.