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

In diesemverwandte FrageIch habe festgestellt, dass der Debugger von Visual Studio die Eigenschaften von aufzählen kannSystem.__ComObject Referenzen, bei denen es sich um "einen verborgenen Typ handelt, der verwendet wird, wenn der Wrapper-Typ nicht eindeutig ist", z.

Wenn Sie einfach den Bezeichner eines COM-Objekts in das Direktfenster schreiben, werden dessen Eigenschaften und Werte auf ähnliche Weise gesichert:

Beachten Sie, dass dies von VS2010 getrennt ist. "Dynamische Ansicht", was ich glaube verwendetIDispatch und COM Reflection, um die Eigenschaften von COM-Objekten ohne Verwendung von PIAs und .NET Reflection aufzulisten. Die Objekte, mit denen ich arbeite, tun esnicht implementierenIDispatch (noch implementieren sieIProvideClassInfo Aus diesem Grund kann "Dynamic View" keine Informationen darüber abrufen:

Interessant,SharpDevelopDer Debugger von kann die Mitglieder von nicht auflistenSystem.__Comobjects (z.B.point.Envelope), nur stark typisierte RCWs (z.point).

Wie ist Visual Studio dazu in der Lage?

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

Wie greift es zunächst auf die PIAs zu? Betrachtet es nur aktuell geladene PIAs oder lädt es sie dynamisch (und wenn ja, wie)? Wie wird bestimmt, welche Schnittstelle, von denen es viele geben kann, die Eigenschaften von aufzulisten? Es scheint nur einen zu verwenden, und nicht unbedingt den ersten. Von demDokumentation Von der API, mit der ich arbeite (ArcObjects), ist die Standardschnittstelle für diese ObjekteIUnknownEs wird also nicht nur die Standardschnittstelle verwendet.

In dem Beispiel in den Screenshots ist die Schnittstelle, in der die Mitglieder aufgelistet werden, dieIEnvelope Schnittstelle, die von der erbtIGeometry Schnittstelle. Woher weiß VS2010, dass die Mitglieder von nicht aufgelistet werden sollen?IGeometry Welche wird in meinen Tests stattdessen zuerst angezeigt, wenn Sie nur alle Schnittstellentypen in der PIA auflisten? Ist etwas sehr Kluges los oder fehlt mir etwas Offensichtliches?

Der Grund, den ich frage, ist, dass der Entwickler vonLINQPad scheint bereit zu sein die gleiche Funktionalität zu implementieren, wenn er wusste, wie VS es tut. Eine gute Antwort hier könnte also einen großen Beitrag zur Verbesserung dieses sehr beliebten Tools leisten.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage