无法在 Visual Studio SDK 中获取服务

适用于: Visualstudio

本文介绍无法在 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 进行定位。

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

使用了错误的服务提供商

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

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

如果工具窗口承载用户控件或任何其他控件容器,则容器将位于 Windows 组件模型,并且无法访问任何 Visual Studio 服务。 可以调用 GetGlobalService 以从控制容器内获取 VSPackage 服务提供程序。

References