2011-01-14 1 views
0

내가이 코드가있는 UserControl을의 방법이 Component.GetService()을 이해 나는 Visual Studio 및 사이의 중개자 역할을하려고하는 "프록시"클래스에이 방법을 이동하려는

 public bool GetActiveDocument(ref EnvDTE.Document doc) 
    { 
     try 
     { 
      var dte = (DTE2)GetService(typeof(SDTE)); 
      doc = dte.ActiveDocument; 
      if (doc == null) 
      { 
       MessageBox.Show("There isn't any file open in the Code Editor"); 
       return false; 
      } 
      else return true; 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("There was a problem getting the actual file, verify if it is open"); 
      return false; 
     } 
    } 

내 응용 프로그램. 문제는 GetService가 컨트롤 내에서 호출 된 경우에만 활성 문서를 올바르게 반환한다는 것입니다. 해당 메서드를 Proxy 클래스로 이동할 때 GetService에는 정의가 없습니다. 이 메서드는 ComponentModel.Component에서 검색되므로 Proxy 클래스를 Component에서 파생 시켰습니다. 모든 것은 OK이지만 항상 활성 문서를 요청할 때 예외가 발생합니다. 내가 잘 이해하지 못하는 건 GetService() 메서드가 어떻게 작동하는지. 이걸 도와주세요.

답변

1

Component.GetService는 구성 요소의 Site 속성에 할당 된 ISite 인스턴스에서 IServiceProvider.GetService를 호출합니다 (있는 경우). 프록시 인스턴스를 Component에서 상속하지 않아도되지만 ISite/IServiceProvider에 액세스 권한을 부여해야합니다.

+0

고맙습니다. 나는 아직도 잘 이해하지 못한다. 그러나 ISite의 referece로 GetService를 호출하는 것이 내가 필요한 모든 것이다. 필자는 Intellisense가 원래 GetService 메서드 위로 커서를 놓았을 때 Component.GetService라고 알려주고 실제로 호출하고 IServiceProvider.GetService가 아닌 것을 알 수 있습니다. – mjsr

+0

Component.GetService 구현은 Site 속성의 GetService 메서드를 호출합니다. Intellisense는 구현이 아닌 문서를 보여줍니다. Component.GetService 구현의 세부 사항에 관심이 있다면 Reflector (http://www.red-gate.com/products/dotnet-development/reflector/)의 사본을 가져와야 할 수 있습니다. –

+0

.net reflector에 대한 조언을 따르십시오. 그런 다음 GetService 구현을 살펴본 다음 GetService() 메서드를 호출 할 최종 책임을 ISite 구현하는 개체와 정확히 같습니다. 인상적인 도구, 코드를 다시 작성하는 방법이 인상적입니다. 나는 여전히 내가 구성 요소 모델에 대한 진정한 이해가 없다고 생각하지만 이것은 계몽의 길에서 정말로 도움이된다. 주제에 대해 계속해서 검색 할 것입니다. – mjsr