Wie speichert Visual Studio Debugger / interaktives Fenster die Eigenschaften von COM-Objekten in .NET?

9

In dieser verwandten Frage habe ich festgestellt, dass der Debugger von Visual Studio in der Lage ist, die Eigenschaften von System.__ComObject Verweise, was "ein versteckter Typ ist, der verwendet wird, wenn der Wrappertyp ist mehrdeutig "- zB der Typ des Objekts, das Sie erhalten, wenn Sie es von einem anderen COM-Objekt erhalten und es nicht selbst instanziieren:

Wenn Sie darüber hinaus einfach den Bezeichner eines COM-Objekts in das Direktfenster schreiben, werden seine Eigenschaften und Werte ähnlich ausgegeben:

Beachten Sie, dass dies separat von VS2010 ist " Dynamische Ansicht ", von der ich glaube, dass sie IDispatch und COM-Reflektion zum Aufzählen der Eigenschaften von COM-Objekten ohne Verwendung von PIAs und .NET-Reflektion. Die Objekte, mit denen ich arbeite, implementieren nicht IDispatch (noch implementieren sie IProvideClassInfo für diese Angelegenheit, und als solche kann" Dynamic View "keine Informationen über sie erhalten:

Interessanterweise kann der SharpDevelop Debugger die Mitglieder von System.__Comobject s nicht auflisten (zB point.Envelope ), nur stark typisierte RCWs (zB point ).

Wie ist Visual Studio dazu in der Lage?

Ich glaube, dass in diesem Fall primäre Interop-Assemblys mit Definitionen für die von diesen Objekten unterstützten Interfaces vorhanden sind und Visual Studio wahrscheinlich Reflektionen verwendet, um die unterstützten Interfaces und Eigenschaften aufzulisten. Ist das genau? Und wenn ja, wie funktioniert es?

Wie greift es zunächst auf die PIAs zu? Betrachtet es nur aktuell geladene PIAs oder lädt es dynamisch (und wenn ja, wie)? Wie bestimmt es, welche Schnittstelle, von welcher es viele geben kann, die Eigenschaften von? Es scheint nur eins zu benutzen, und nicht unbedingt das erste. Von der Dokumentation der API, mit der ich arbeite ( ArcObjects), die Standardschnittstelle für diese Objekte ist IUnknown , so dass nicht nur die Standardschnittstelle verwendet wird. p>

In dem Beispiel in den Screenshots ist die Schnittstelle, auf der die Mitglieder aufgelistet sind, IEnvelope Schnittstelle, die von der IGeometry Schnittstelle. Wie kann VS2010 die Member von IGeometry nicht aufzählen, was bei meinen Tests zuerst angezeigt wird, wenn Sie nur alle Schnittstellentypen in der PIA aufzählen? Etwas sehr schlaues passiert oder vielleicht fehlt mir etwas offensichtlich?

Der Grund, warum ich frage, ist, dass der Entwickler von LINQPad scheint bereit zu sein , die gleiche Funktionalität zu implementieren, wenn er wüsste, wie VS es macht. Eine gute Antwort könnte also sehr viel dazu beitragen, dieses sehr beliebte Werkzeug zu verbessern.

    
blah238 10.02.2013, 13:20
quelle

1 Antwort

2

So geht es:

  • Erhalte das COM-Objekt IDispatch (alternativer möglicher Pfad ist IDispatchEx )
  • erhalten Sie einen Verweis auf die Typbibliothek - IDispatch::GetTypeInfo
  • lädt die Typbibliothek und nummeriert Eigenschaften
  • Abfrage des realen Objekts nach Werten für die erkannten Eigenschaften

Es gibt zusätzliche Erweiterungsoptionen: query IPersist* family of interfaces oder IProvideClassInfo , um alternativ einen Verweis auf typelibrary für das Objekt zu erhalten und Eigenschaften zu ermitteln.

    
Roman R. 10.02.2013 13:49
quelle