Hizmet alma

Farklı özelliklere erişmek için genellikle Visual Studio hizmetlerini almanız gerekir. Genel olarak, Visual Studio hizmeti kullanabileceğiniz bir veya daha fazla arabirim sağlar. Çoğu hizmeti bir VSPackage'dan alabilirsiniz.

Package sınıfından türetilmiş ve doğru şekilde yerleştirilmiş herhangi bir VSPackage, her türlü genel hizmeti talep edebilir. Package sınıfı IServiceProvider uyguladığından, Package'den türetilen herhangi bir VSPackage da bir hizmet sağlayıcısıdır.

Visual Studio bir Package yüklediğinde, başlatma sırasında bir IServiceProvider nesnesini SetSite yöntemine geçirir. Buna VSPackage'ın konumlandırılması denir. Package sınıfı bu hizmet sağlayıcısını sarar ve hizmetleri almak için GetService yöntemini sağlar.

Başlatılmış bir VSPackage'dan hizmet alma

  1. Her Visual Studio uzantısı, uzantı varlıklarını içeren bir VSIX dağıtım projesiyle başlar. adlı GetServiceExtensionbir Visual Studio VSIX projesi oluşturun. VSIX proje şablonunu yeni proje iletişim kutusunda "vsix" araması yaparak bulabilirsiniz.

  2. Şimdi GetServiceCommand adlı özel bir komut öğesi şablonu ekleyin. Yeni Öğe Ekle iletişim kutusunda Visual C#>Genişletilebilirlik'e gidin ve Özel Komut'a tıklayın. Pencerenin en altındaki Ad alanında, komut dosyası adını GetServiceCommand.cs olarak değiştirin. Özel komut oluşturma hakkında daha fazla bilgi için , Menü komutuyla uzantı oluşturma

  3. GetServiceCommand.cs dosyasındaki metodun gövdesini MenuItemCommand kaldırın ve aşağıdaki kodu ekleyin:

    IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (activityLog == null) return;
    System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    
    

    Bu kod bir SVsActivityLog hizmeti alır ve bunu etkinlik günlüğüne yazmak için kullanılabilecek bir IVsActivityLog arabirime yayınlar. Örnek için bkz . Nasıl yapılır: Etkinlik günlüğünü kullanma.

  4. Projeyi derleyin ve hata ayıklamaya başlayın. Deneysel örnek görüntülenir.

  5. Deneysel örneğin Araçlar menüsünde GetServiceCommand'ı Çağır düğmesini bulun. Bu düğmeye tıkladığınızda, Etkinlik günlüğü hizmeti bulundu ifadesini içeren bir ileti kutusu görmeniz gerekir.

Araç penceresinden veya denetim kapsayıcısından hizmet alma

Bazen bir araç penceresinden veya sitelendirilmemiş veya istediğiniz hizmet hakkında bilgi sahibi olmayan bir hizmet sağlayıcısıyla sitelenmiş olan bir denetim kapsayıcısından hizmet almanız gerekebilir. Örneğin, bir denetimin içinden etkinlik günlüğüne yazmak isteyebilirsiniz.

Statik GetGlobalService yöntemi, Package ile türetilmiş herhangi bir VSPackage ilk kez sitedildiğinde başlatılan önbelleğe alınmış bir hizmet sağlayıcısına dayanır.

VSPackage oluşturucu, VSPackage sitelendirilmeden önce çağrıldığından, genel hizmetler genellikle VSPackage oluşturucusunun içinden kullanılamaz. Geçici bir çözüm için bkz Nasıl yapılır: Hizmetlerle İlgili Sorunları Giderme.

Bir araç penceresinde veya VSPackage olmayan başka bir öğede hizmet alma yöntemine bir örnek aşağıda verilmiştir.

IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

DTE nesnesinden hizmet alma

Ayrıca nesneden DTEClass de hizmet alabilirsiniz. Ancak, DTE nesnesini bir VSPackage'dan veya statik GetGlobalService yöntemi çağırarak hizmet olarak almanız gerekir.

DTE nesnesi, GetService kullanarak bir hizmeti sorgulamak için IServiceProvider'yı uygular.

İşte DTE nesnesinden bir hizmet almanın yolu.

// Start with the DTE object, for example: 
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));

ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
    IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (log != null)
    {
        System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    }
}