다음을 통해 공유


Visual Studio SDK에서 서비스를 가져올 수 없습니다.

적용 대상: Visual Studio

이 문서에서는 Visual Studio SDK에서 서비스를 가져올 수 없는 일반적인 원인과 솔루션을 소개합니다.

요청된 서비스를 가져올 수 없는 경우 null을 반환하는 GetService 호출입니다. 서비스를 요청한 후 항상 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"

이 예제에서 버전 번호는 12.0 또는 14.0과 같은 Visual Studio 버전이고, 키 {F5E7E71D-1401-11d1-883B-0000F87579D2} 는 서비스의 SID(서비스 식별자)이며, 기본값 {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 서비스 공급자를 가져올 수 있습니다.

참조