Hizmet sağlama

VSPackage, diğer VSPackage'ların kullanabileceği hizmetler sağlayabilir. Bir hizmeti sağlamak için VSPackage'ın hizmeti Visual Studio'ya kaydetmesi ve hizmeti eklemesi gerekir.

Package sınıfı hem hem IServiceContainerde IServiceProvider uygular. IServiceContainer isteğe bağlı hizmetler sağlayan geri çağırma yöntemleri içerir.

Hizmetler hakkında daha fazla bilgi için bkz . Hizmet temel bileşenleri .

Dekont

BIR VSPackage kaldırılmak üzereyken, Visual Studio bir VSPackage tarafından sağlanan tüm hizmetlere yönelik isteklerin teslim edilmesi için bekler. Bu hizmetler için yeni isteklere izin vermez. Kaldırma sırasında bir hizmeti iptal etmek için yöntemini açıkça çağırmamalısınız RevokeService .

Hizmet uygulama

  1. VSIX projesi oluşturma (Dosya>Yeni>Proje>Görseli C#>Genişletilebilirlik>VSIX Projesi).

  2. Projeye bir VSPackage ekleyin. Çözüm Gezgini proje düğümünü seçin ve Yeni öğe>Ekle>Visual C# Öğeleri>Genişletilebilirlik>Visual Studio Paketi'ne tıklayın.

  3. Bir hizmeti uygulamak için üç tür oluşturmanız gerekir:

    • Hizmeti açıklayan bir arabirim. Bu arabirimlerin çoğu boş, yani yöntemleri yoktur.

    • Hizmet arabirimini açıklayan bir arabirim. Bu arabirim uygulanacak yöntemleri içerir.

    • Hem hizmeti hem de hizmet arabirimini uygulayan bir sınıf.

      Aşağıdaki örnekte üç türün temel uygulaması gösterilmektedir. Hizmet sınıfının oluşturucusunun hizmet sağlayıcısını ayarlaması gerekir.

    public class MyService : SMyService, IMyService
    {
        private Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider;
        private string myString;
        public MyService(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp)
        {
            Trace.WriteLine(
                   "Constructing a new instance of MyService");
            serviceProvider = sp;
        }
        public void Hello()
        {
            myString = "hello";
        }
        public string Goodbye()
        {
           return "goodbye";
        }
    }
    public interface SMyService
    {
    }
    public interface IMyService
    {
        void Hello();
        string Goodbye();
    }
    
    

Hizmet kaydetme

  1. Bir hizmeti kaydetmek için hizmetini sağlayan VSPackage'a ekleyin ProvideServiceAttribute . Örnek aşağıda verilmiştir:

    [ProvideService(typeof(SMyService))]
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [Guid(VSPackage1.PackageGuidString)]
    public sealed class VSPackage1 : Package
    {. . . }
    

    Bu öznitelik Visual Studio'ya kaydolr SMyService .

    Dekont

    Başka bir hizmetin yerine aynı adı taşıyan bir hizmeti kaydetmek için kullanın ProvideServiceOverrideAttribute. Bir hizmetin yalnızca bir geçersiz kılınma işlemine izin verildiğini unutmayın.

Hizmet ekleme

  1. VSPackage başlatıcısında hizmeti ekleyin ve hizmetleri oluşturmak için bir geri çağırma yöntemi ekleyin. Yönteminde yapılması gereken değişiklik aşağıdadır Initialize :

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. Hizmeti oluşturup döndürmesi gereken geri çağırma yöntemini veya oluşturulamazsa null değerini uygulayın.

    private object CreateService(IServiceContainer container, Type serviceType)
    {
        if (typeof(SMyService) == serviceType)
            return new MyService(this);
        return null;
    }
    

    Dekont

    Visual Studio hizmet sağlama isteğini reddedebilir. Başka bir VSPackage hizmeti zaten sağlıyorsa bunu yapar.

  3. Artık hizmeti alabilir ve yöntemlerini kullanabilirsiniz. Aşağıdaki örnekte başlatıcıda hizmeti kullanma gösterilmektedir, ancak hizmeti kullanmak istediğiniz her yerden alabilirsiniz.

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    
        MyService myService = (MyService) this.GetService(typeof(SMyService));
        myService.Hello();
        string helloString = myService.Goodbye();
    
        base.Initialize();
    }
    

    değeri helloString "Hello" olmalıdır.