2012-05-16 16 views
14

¿Cómo puedo leer todos los nombres de propiedades mediante la reflexión de un objeto COM en C#? Sé cómo obtener la propiedad si sé el nombre.Obtener nombres de propiedades a través de la reflexión de un objeto COM

comObject.GetType().InvokeMember("PropertyName", System.Reflection.BindingFlags.GetProperty, null, comObject, null); 

pero ¿qué es cuando quiero eliminar todas las propiedades?

PropertyInfo[] properties = t.GetProperties(); 

De esta manera no funcionó con Com-Objects. Si hago un GetMembers() consigo estos miembros:

Name: GetLifetimeService 
Name: InitializeLifetimeService 
Name: CreateObjRef 
Name: ToString 
Name: Equals 
Name: GetHashCode 
Name: GetType 

que respecta a Chris

+2

No está claro lo que está pidiendo, porque ya está proporcionando la respuesta. 'GetProperties' devolverá todas las propiedades de un tipo. –

+0

Bueno, 'PropertyInfo.Name'? –

+2

¡Pero no de un objeto COM! –

Respuesta

12

Tienes los miembros de la clase __ComObject, la clase de .NET subyacente para un RCW.

COM tiene un poco de soporte para la reflexión, siempre que el COM coclass implemente IDispatch, la interfaz de automatización. No es inusual, es la interfaz que utilizan los lenguajes de scripting para hacer llamadas. IDispatch.GetIDsOfNames() siempre se implementa, pero debe saber el nombre del miembro por adelantado. IDispatch.GetTypeInfo() da acceso a la biblioteca de tipos para el coclass, pero no siempre se implementa. La traducción de la información de tipo biblioteca a los metadatos es un arte imperfecto, la razón principal por la cual .NET quiere que hagas esto por adelantado con Tlbimp.exe. Si desea seguir un enfoque de tiempo de ejecución, probablemente se beneficie de la fuente de la versión administrada de Tlbimp, available here.

Hacer esto desde el principio en el momento de compilar es siempre lo mejor, lo hace agregando una referencia a la biblioteca de tipos (generalmente incrustado en el archivo ejecutable) o ejecutando Tlbimp.exe usted mismo. Ahora tiene una clase .NET interoperador que tiene todos los miembros de las interfaces y cocos de COM subyacentes. En ese momento probablemente ya no necesites reflexión :)

10

Acabo de publicar un artículo de CodeProject sobre cómo hacer Reflection with IDispatch-based COM objects. El artículo proporciona una pequeña clase de ayuda C# DispatchUtility que es fácil de incluir en otros proyectos. Internamente, utiliza una declaración personalizada de IDispatch y TypeToTypeInfoMarshaler de .NET para convertir ITypeInfo de IDispatch en una instancia rica de tipo .NET.

En su ejemplo, puede llamar al DispatchUtility.GetType(comObject, true) para recuperar una instancia de tipo .NET, que luego puede llamar a GetProperties o GetMembers.

también he proporcionado una versión del código fuente DispatchUtility en StackOverflow en una respuesta a How to enumerate members of COM object in C#?

+0

Gracias por el asombroso artículo. Intenté usarlo, pero enfrentando un problema. Recibo un error: "la biblioteca de tipos se exportó desde un ensamblaje clr y no se puede volver a importar" Estoy usando Activator.createInstance para crear el objeto. La herramienta para la que estoy creando el objeto COM es Tibco Spotfire v6.5.2 ¿Podría ayudarme? Gracias – Prabhakar

+0

@Bill Menees, ¿podría usar su clase de ayuda en [PowerShell para crear una instancia de objeto COM] (http://stackoverflow.com/questions/41945859/use-powershell-to-create-instance-of-com-object)? – craig

Cuestiones relacionadas