無法在 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 月臺。
如果您在需要服務的 VSPackage 建構函式中有程式代碼,請將它 Initialize
移至 方法。
使用錯誤的服務提供者
請確定您使用的是正確的服務提供者。
並非所有服務提供者都一樣。 Visual Studio 傳遞給工具視窗的服務提供者與傳遞給 VSPackage 的服務提供者不同。 工具視窗服務提供者知道 , STrackSelection但不知道 SVsRunningDocumentTable。 您可以從工具視窗中呼叫 GetGlobalService 來取得 VSPackage 服務提供者。
如果工具視窗裝載使用者控件或任何其他控件容器,容器將會由Windows 元件模型月臺,而且無法存取任何Visual Studio服務。 您可以呼叫 GetGlobalService 來從控制容器內取得 VSPackage 服務提供者。