visual studio 2010 - code - ¿Cómo la ventana depuradora/interactiva de Visual Studio vuelca las propiedades de los objetos COM en.NET?
debugging javascript visual studio code (1)
Asi es como se hace:
- obtener el
IDispatch
del objeto COM (la ruta alternativa posible esIDispatchEx
) - obtener una referencia a la biblioteca de tipos -
IDispatch::GetTypeInfo
- cargar tipo biblioteca y enumerar propiedades
- consultar objeto real para valores para propiedades descubiertas
Se aplican oipions de mejora adicionales: consultar IPersist*
familia de interfaces o IProvideClassInfo
para obtener alternativamente una referencia a typelibrary para el objeto y descubrir propiedades.
En esta pregunta relacionada , observé que el depurador de Visual Studio puede enumerar las propiedades de System.__ComObject
references, que es "un tipo oculto utilizado cuando el tipo de envoltura es ambiguo", por ejemplo, el tipo de objeto que obtienes cuando obtienes desde otro objeto COM y no lo instancia 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 la " Vista dinámica " de VS2010, que creo que usa IDispatch
y reflexión COM para enumerar las propiedades de los objetos COM sin el uso de PIA y reflexión .NET. Los objetos con los que estoy trabajando no implementan IDispatch
(ni tampoco implementan IProvideClassInfo
), y como tal, "Vista dinámica" no puede obtener ninguna información sobre ellos:
Curiosamente, el depurador de SharpDevelop no puede listar a los miembros de System.__Comobject
s (por ejemplo, point.Envelope
), solo los RCW fuertemente tipados (p. Ej., point
).
Entonces, ¿cómo es capaz Visual Studio de hacerlo?
Creo que en este caso, es porque las Asambleas de interoperabilidad primarias existen con las definiciones de las interfaces admitidas por estos objetos, y es probable que Visual Studio utilice la reflexión para enumerar las interfaces y propiedades admitidas. Es eso exacto? Y si es así, ¿cómo funciona?
Para empezar, ¿cómo accede a los PIA? ¿Mira solo los PIA actualmente cargados o los carga dinámicamente (y si es así, cómo)? ¿Cómo se determina qué interfaz, de la que puede haber muchas, para enumerar las propiedades de? Parece que solo usa uno, y no necesariamente el primero. De la documentación de la API con la que estoy trabajando (ArcObjects), la interfaz predeterminada para estos objetos es IUnknown
, por lo que no solo usa la interfaz predeterminada.
En el ejemplo de las capturas de pantalla, la interfaz de la que está enumerando los miembros es la interfaz IEnvelope
, que hereda de la interfaz IGeometry
. ¿Cómo sabe VS2010 no enumerar los miembros de IGeometry
en IGeometry
lugar, lo cual, en mi prueba, aparece primero si solo enumera todos los tipos de interfaz en la PIA? ¿Algo muy ingenioso pasando o quizás me falta algo obvio?
La razón por la que estoy preguntando es que el desarrollador de LINQPad parece dispuesto a implementar la misma funcionalidad si sabía cómo lo hace VS. Entonces, una buena respuesta aquí podría ayudar mucho a mejorar esa herramienta tan popular.