Obtenir des noms de propriété par la réflexion d'un objet COM
Comment puis-je lire tous les noms de propriété par la réflexion d'un Objet COM en C#?
Je sais comment obtenir la propriété si je connais le nom.
comObject.GetType().InvokeMember("PropertyName", System.Reflection.BindingFlags.GetProperty, null, comObject, null);
mais qu'est-ce que quand je veux vider toutes les propriétés?
PropertyInfo[] properties = t.GetProperties();
De cette façon n'a pas Com-Objets. Si je fais un GetMembers (), je reçois ces Membres:
Name: GetLifetimeService
Name: InitializeLifetimeService
Name: CreateObjRef
Name: ToString
Name: Equals
Name: GetHashCode
Name: GetType
ce qui concerne Chris
Il n'est pas clair ce que vous demandez, parce que vous êtes déjà fourni la réponse.
Eh bien,
Mais pas de un COM-Objet!
Si l'Objet COM met en œuvre
GetProperties
sera de retour toutes les propriétés d'un type.Eh bien,
PropertyInfo.Name
?Mais pas de un COM-Objet!
Si l'Objet COM met en œuvre
IDispatch
vous pouvez essayer de moulage System.Reflection.IReflect
et l'utilisation de méthodes d'examiner l'objet.OriginalL'auteur masterchris_99 | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
Vous avez obtenu les membres de l' __ComObject classe, la sous-jacentes .NET la classe pour un BRF.
COM a un petit peu de soutien pour la réflexion, aussi longtemps que la COM de la coclasse implémente IDispatch, l'interface d'Automatisation. Pas inhabituelle, elle est l'interface que les langages de script à utiliser pour effectuer des appels. IDispatch.GetIDsOfNames() est toujours appliquée, mais vous devez connaître le nom du membre à l'avant. IDispatch.GetTypeInfo() donne accès à la bibliothèque de type pour la coclasse, mais n'est pas toujours mis en œuvre. Traduction de type de la bibliothèque d'informations de métadonnées est imparfaite, à l'art, la raison principale pourquoi .NET veut que vous pour ce faire à l'avance avec Tlbimp.exe. Si vous souhaitez poursuivre l'exécution approche, alors vous aurez probablement profiter de la source pour la gestion de version de Tlbimp, disponible ici.
Ce faisant front au moment de la construction est toujours le meilleur, vous le faites par l'ajout d'une référence à la bibliothèque de type (généralement incorporés dans le fichier exécutable) ou en cours d'exécution Tlbimp.exe vous-même. Maintenant vous avez un .NET interop classe wrapper qui a tous les membres de la sous-COM coclasse et des interfaces. À quel point vous n'avez probablement pas besoin d'une réflexion plus 🙂
OriginalL'auteur
J'ai tout juste de publier un article sur CodeProject comment faire Réflexion avec IDispatch basé sur des objets COM. L'article donne un petit C#
DispatchUtility
de la classe helper c'est facile de les inclure dans d'autres projets. En interne, il utilise une déclaration de IDispatch et .NET TypeToTypeInfoMarshaler pour convertir IDispatch de ITypeInfo dans un riche .NET Type d'instance.Dans votre exemple, vous pourriez l'appeler
DispatchUtility.GetType(comObject, true)
pour retrouver une .NET instance de Type, que vous pouvez ensuite appeler GetProperties ou GetMembers.J'ai également fourni une version de la DispatchUtility le code source sur StackOverflow dans une réponse à Comment énumérer les membres de l'objet COM en C#?
Menees, pourrait votre classe helper être utilisé dans PowerShell pour créer une instance d'objet COM?
OriginalL'auteur