¿Cómo el depurador de Visual Studio / la ventana interactiva vuelca las propiedades de los objetos COM en .NET?

En estopregunta relacionada, Noté que el depurador de Visual Studio es capaz de enumerar las propiedades deSystem.__ComObject las referencias, que son "un tipo oculto que se usa cuando el tipo de envoltura es ambiguo", por ejemplo, el tipo de objeto que obtiene cuando lo obtiene de otro objeto COM y no lo ejemplifica usted mismo:

Además, si simplemente escribe el identificador de un objeto COM en la ventana Inmediato, sus propiedades y valores se vuelcan de manera similar:

Tenga en cuenta que esto está separado de VS2010 "Vista dinámica", que creo que utilizaIDispatch y la reflexión de COM para enumerar las propiedades de los objetos COM sin el uso de PIA y la reflexión de .NET. Los objetos con los que estoy trabajando hacen.no implementarIDispatch (ni implementanIProvideClassInfo de hecho, y como tal, "Dynamic View" no puede obtener ninguna información sobre ellos:

Curiosamente,SharpDesarrollarEl depurador no puede enumerar a los miembros deSystem.__Comobjects (por ejemplo,point.Envelope), solo RCW fuertemente tipados (por ejemplo,point).

Entonces, ¿cómo es capaz Visual Studio de hacerlo?

Creo que en este caso, se debe a que los ensamblajes de interoperabilidad primarios existen con definiciones para las interfaces compatibles con estos objetos, y Visual Studio probablemente esté utilizando la reflexión para enumerar las interfaces y propiedades compatibles. ¿Es eso exacto? Y si es así, ¿cómo funciona?

Para empezar, ¿cómo accede a los PIAs? ¿Solo se ve en los PIA cargados actualmente o los carga dinámicamente (y si es así, cómo)? ¿Cómo determina qué interfaz, de la que puede haber muchas, para enumerar las propiedades de? Solo parece usar uno, y no necesariamente el primero. Desde eldocumentación de la API con la que estoy trabajando (ArcObjects), la interfaz predeterminada para estos objetos esIUnknown, por lo que tampoco es solo usar la interfaz predeterminada.

En el ejemplo de las capturas de pantalla, la interfaz en la que se enumeran los miembros es laIEnvelope interfaz, que hereda de laIGeometry interfaz. ¿Cómo sabe VS2010 no enumerar los miembros deIGeometry en cambio, ¿cuál, en mis pruebas, aparece primero si simplemente enumera todos los tipos de interfaz en el PIA? ¿Pasa algo muy inteligente o me falta algo obvio?

La razón por la que pregunto es que el desarrollador deLINQPad parece dispuesto para implementar la misma funcionalidad si supiera cómo VS lo hace. Por lo tanto, una buena respuesta aquí podría ayudar mucho a mejorar esa herramienta tan popular.

Respuestas a la pregunta(1)

Su respuesta a la pregunta