提供服务

VSPackage 可以提供其他 VSPackage 可以使用的服务。 若要提供服务,VSPackage 必须将服务注册到 Visual Studio 并添加该服务。

Package 类实现这两个和 IServiceProvider IServiceContainer. IServiceContainer 包含按需提供服务的回调方法。

有关服务的详细信息,请参阅 服务概要

注意

当 VSPackage 即将卸载时,Visual Studio 会等待 VSPackage 提供的所有服务请求都已交付。 它不允许对这些服务发出新请求。 在卸载时,不应显式调用 RevokeService 方法来撤销服务。

实现服务

  1. 创建 VSIX 项目(文件>新建>项目>Visual C#>Extensibility>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
    {. . . }
    

    此属性注册 SMyService 到 Visual Studio。

    注意

    若要注册将另一个服务替换为同名的服务,请使用 < a0 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”。