无法在 Visual Studio SDK 中获取服务

适用于: Visual Studio

本文介绍在 Visual Studio SDK 中无法 获取服务 时的常见原因和解决方案。

如果无法获取请求的服务,则返回 GetService null 的调用。 在请求服务后始终测试 null:

IVsActivityLog log =
    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

该服务未向 Visual Studio 注册

检查系统注册表,查看服务是否已正确注册。 有关详细信息,请参阅 “如何:提供服务”。

以下示例 .reg 文件片段显示了 SVsTextManager 服务如何注册:

[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\<version number>\Services\{F5E7E71D-1401-11d1-883B-0000F87579D2}]
@="{F5E7E720-1401-11d1-883B-0000F87579D2}"
"Name"="SVsTextManager"

在此示例中,版本号是 Visual Studio 的版本(例如 12.0 或 14.0),密钥 {F5E7E71D-1401-11d1-883B-0000F87579D2} 是服务的服务标识符(SID),SVsTextManager {F5E7E720-1401-11d1-883B-0000F87579D2} 的默认值是文本管理器 VSPackage 的包 GUID,后者提供服务。

服务按接口类型而不是按服务类型请求

调用时 GetService,请使用服务类型,而不是接口类型。 从 Visual Studio 请求服务时, Package 从类型中提取 GUID。 如果:

  • 接口类型将 GetService 传递给服务类型,而不是服务类型。
  • 未将 GUID 显式分配给接口。 因此,系统会根据需要为对象创建默认 GUID。

请求服务的 VSPackage 尚未定位

确保已将请求服务的 VSPackage 站点化。 Visual Studio 在构造 VSPackage 之后和调用 Initialize之前网站。

如果 VSPackage 构造函数中有需要服务的代码,请将其 Initialize 移动到方法。

使用了错误的服务提供商

请确保使用正确的服务提供商。

并非所有服务提供商都一样。 Visual Studio 传递给工具窗口的服务提供商不同于它传递给 VSPackage 的服务提供程序。 工具窗口服务提供商知道, STrackSelection但不知道 SVsRunningDocumentTable。 可以从工具窗口中调用 GetGlobalService 以获取 VSPackage 服务提供程序。

如果工具窗口托管用户控件或任何其他控件容器,该容器将由 Windows 组件模型站点,并且无法访问任何 Visual Studio 服务。 可以从控制容器中调用 GetGlobalService 获取 VSPackage 服务提供程序。

参考