共用方式為


提供服務

VSPackage 可以提供其他 VSPackage 可以使用的服務。 若要提供服務,VSPackage 必須向 Visual Studio 註冊服務並新增服務。

Package 類別會同時實作 IServiceProviderIServiceContainerIServiceContainer 包含可依需求提供服務的回呼方法。

如需服務的詳細資訊,請參閱服務要點

注意

即將卸載 VSPackage 時,Visual Studio 會等到 VSPackage 提供的所有服務要求都已傳遞為止。 它不會允許這些服務的新要求。 您不應該在卸載時明確呼叫 RevokeService 方法來撤銷服務。

實作服務

  1. 建立 VSIX 專案 ([檔案]>[新增]>[專案]>[Visual C#]>[擴充性]>[VSIX 專案])。

  2. 將 VSPackage 新增至專案 選取 [解決方案總管] 中的專案節點,然後按一下 [新增]>[新增項目]>[Visual C# 項目]>[擴充性]>[Visual Studio 套件]

  3. 若要實作服務,您需要建立三種類型:

    • 描述服務的介面。 其中許多介面都是空的,也就是說,它們沒有方法。

    • 描述服務介面的介面。 這個介面包含要實作的方法。

    • 實作服務和服務介面的類別。

      下列範例會示範三種類型的基本實作。 服務類別的建構函式必須設定服務提供者。

    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();
    }
    
    

註冊服務

  1. 若要註冊服務,請將 ProvideServiceAttribute 新增至提供服務的 VSPackage。 以下是範例:

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

    此屬性會使用 Visual Studio 註冊 SMyService

    注意

    若要註冊會取代另一個同名服務的服務,請使用 ProvideServiceOverrideAttribute。 請注意,只允許一個服務覆寫。

新增服務

  1. 在 VSPackage 初始設定程式中,新增服務並新增回呼方法來建立服務。 以下是對 Initialize 方法所做的變更:

    protected override void Initialize()
    {
        ServiceCreatorCallback callback =new ServiceCreatorCallback(CreateService);
    
        ((IServiceContainer)this).AddService(typeof(SMyService), callback);
    . . .
    }
    
  2. 實作回呼方法,這個方法應該建立並傳回服務,如果無法建立,則為 null。

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

    注意

    Visual Studio 可以拒絕提供服務的要求。 如果另一個 VSPackage 已提供服務,則執行此動作。

  3. 現在您可以取得服務,並使用其方法。 下列範例顯示使用初始設定程式中的服務,但您可以在您想要使用服務的任何位置取得服務。

    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();
    }
    

    helloString 的值應該是「Hello」。