2013-02-10 3 views
9

related question에서는 Visual Studio의 디버거가 System.__ComObject 참조의 속성을 열거 할 수 있다고 언급했습니다.이 래퍼 유형은 "래퍼 유형이 모호 할 때 사용되는 숨겨진 형식"입니다. 예를 들어, 가져올 때 얻을 수있는 개체 유형 다른 COM 객체로부터 스스로를 인스턴스화하지 않습니다Visual Studio의 디버거/대화 형 창은 .NET에서 COM 개체의 속성을 어떻게 덤프합니까?

COM Object Debug View

을 추가, 당신은 단순히 직접 실행 창에 COM 개체의 식별자를 작성하는 경우, 해당 속성 및 값이 유사 덤프됩니다 :

COM Object Immediate Window

이것은 VS2010의 "Dynamic View"과 별개로, IDispatch 및 COM 리플렉션을 사용하여 PIA 및 .NET 리플렉션을 사용하지 않고 COM 개체의 속성을 열거한다고 생각합니다. 내가 함께 일하고 개체는 하지IDispatch을 시행하고 (도 그들은 그 문제에 대한 IProvideClassInfo을 구현합니까)와 같은 "동적 뷰는"그들에 대한 정보를 얻을 수 없을 :

Dynamic View

을 흥미롭게도 SharpDevelop의 디버거는 System.__Comobject (예 : point.Envelope), 강력한 형식의 RCW (예 : point)의 멤버를 나열 할 수 없습니다.

SharpDevelop debugger

어떻게 Visual Studio에서 그것을 할 수있다?

이 경우 기본 인터럽트 어셈블리에는 이러한 개체에서 지원하는 인터페이스에 대한 정의가 존재하며 Visual Studio에서는 리플렉션을 사용하여 지원되는 인터페이스와 속성을 열거하기 때문입니다. 정확하니? 그렇다면 어떻게 작동합니까?

처음에는 어떻게 PIA에 액세스합니까? 현재로드 된 PIA 만 보거나 동적으로로드합니까? (그렇다면 어떻게됩니까?) 그것의 속성을 열거 할 수있는 인터페이스가 무엇인지 결정하는 방법은 무엇입니까? 그것은 단지 하나를 사용하는 것으로 보이며 반드시 첫 번째 것은 아닙니다. 내가 작업하고있는 API 인 ArcObjects의 documentation에서이 객체의 기본 인터페이스는 IUnknown이므로 기본 인터페이스를 사용하는 것만이 아닙니다.

스크린 샷의 예에서 IEnvelope 인터페이스는 구성원을 열거하는 인터페이스이며 IGeometry 인터페이스를 상속합니다. VS2010은 대신 IGeometry의 멤버를 열거하지 않는다는 것을 어떻게 알 수 있습니까? 내 테스트에서 PIA의 모든 인터페이스 유형을 열거하면 가장 먼저 나타납니다. 뭔가 매우 영리하거나 어쩌면 나는 명백한 것을 놓치고 있습니까?

내가 VS의 방법을 알고 있다면 그는 LINQPadappears willing의 개발자가 동일한 기능을 구현해야한다는 이유를 묻습니다. 따라서 여기에 대한 좋은 대답은 매우 인기있는 도구를 개선하는 데 도움이 될 수있는 긴 방법이 될 수 있습니다.

+0

Point 클래스의 Envelope 속성 유형이 PIA에서 IEnvelope로 정의되었으므로 VS가 해당 클래스를 덤프 할 수 있으므로 특별한 메커니즘이 필요하지 않습니다. –

+0

흠 정말로 간단합니까? 이 정보는 디버그시에만 사용할 수 있습니까? (어떻게) 동일한 정보를 런타임에 얻을 수 있습니까? 그리고 왜 SharpDevelop의 디버거도 똑같은 일을하지 않습니다. – blah238

+0

네, 아주 간단합니다. System._ComObject 만 있으면 더 복잡하지만 ComImport .NET 인터페이스로 변환 할 수 있다면 이러한 인터페이스 레이아웃에 액세스 할 수 있습니다. Intellisense를 포함하여 항상 사용 가능합니다. 나는 SharpDevelop에 대해서 모른다. –

답변

2

이 그것을 수행하는 방법입니다 :

  • COM 객체의 IDispatch 라이브러리 입력에 대한 참조를 얻을
  • (대체 가능한 경로가 IDispatchEx입니다) 취득 - IDispatch::GetTypeInfo
  • 로드 형식 라이브러리 및 열거 속성
  • 검색된 속성의 값에 대한 실제 개체

추가 개선 사항 oipions가 적용됩니다. 쿼리 IPersist* 패밀리 또는 IProvideClassInfo을 사용하여 개체에 대한 typelibrary에 대한 참조를 얻거나 속성을 검색 할 수 있습니다.

+0

필자가 쓴 것처럼,이 인터페이스들 중 어느 것도이 객체들에 의해 구현되지 않습니다. 실제로 그들 중 일부는'IPersist'를 구현하지만 전부는 아닙니다. 나는 VS2010이 어떤 것들을 발견 할 수 있는지를 확인하고 비교할 것을 확인해야 할 것입니다. – blah238

+0

'IDispatchEx','IProvideClassInfo2' (글쎄, 이것은 전형적인 것이지 IProvideClassInfo가 아니다.) - 뭔가가 있어야한다. –

+0

아니, 그것도 마찬가지다. – blah238