2012-05-16 22 views
14

Come posso leggere tutti i nomi di proprietà tramite la riflessione di un oggetto COM in C#? So come ottenere la proprietà se conosco il nome.Acquisisci i nomi delle proprietà tramite il riflesso di un oggetto COM

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

ma che cosa è quando voglio scaricare tutte le proprietà?

PropertyInfo[] properties = t.GetProperties(); 

In questo modo non funziona con Com-Objects. Se faccio un GetMembers() ottengo questi Membri:

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

riguarda Chris

+2

Non è chiaro che cosa state chiedendo, perché si sta già fornendo la risposta. 'GetProperties' restituirà tutte le proprietà di un tipo. –

+0

Bene, 'PropertyInfo.Name'? –

+2

Ma non di un oggetto COM! –

risposta

12

Hai i membri della classe __ComObject, la classe .NET sottostante per un RCW.

COM ha un piccolo supporto per la riflessione, purché la coclasse COM implementa IDispatch, l'interfaccia di automazione. Non insolito, è l'interfaccia utilizzata dai linguaggi di scripting per effettuare chiamate. IDispatch.GetIDsOfNames() è sempre implementato, ma devi conoscere il nome del membro in anticipo. IDispatch.GetTypeInfo() dà accesso alla libreria dei tipi per la coclasse, ma non è sempre implementata. La traduzione delle informazioni sulla libreria dei tipi sui metadati è un'arte imperfetta, la ragione principale per cui .NET vuole che tu lo faccia in anticipo con Tlbimp.exe. Se si desidera perseguire un approccio runtime, probabilmente si trarrà vantaggio dall'origine della versione gestita di Tlbimp, available here.

Fare questo in anticipo al momento della compilazione è sempre il migliore, lo si fa aggiungendo un riferimento alla libreria dei tipi (solitamente incorporata nel file eseguibile) o eseguendo Tlbimp.exe autonomamente. Ora hai una classe di .NET Interop wrapper che ha tutti i membri della coclasse COM e delle interfacce sottostanti. A questo punto probabilmente non avrai più bisogno di riflessioni :)

10

Ho appena pubblicato un articolo su CodeProject su come fare Reflection with IDispatch-based COM objects. L'articolo fornisce una piccola classe di helper C# DispatchUtility che è facile da includere in altri progetti. Internamente, utilizza una dichiarazione personalizzata di IDispatch e .NET TypeToTypeInfoMarshaler per convertire l'IDypeInfo di IDispatch in un'istanza di tipo .NET ricca.

Nell'esempio, è possibile chiamare DispatchUtility.GetType(comObject, true) per ottenere un'istanza di tipo .NET, che è possibile chiamare GetProperties o GetMembers.

Ho anche fornito una versione del codice sorgente DispatchUtility su StackOverflow in una risposta ad How to enumerate members of COM object in C#?

+0

Grazie per l'eccezionale articolo. Ho provato a usarlo, ma di fronte a un problema. Sto ricevendo errore: "libreria dei tipi è stata esportata da un assembly clr e non può essere reimportata" Sto utilizzando Activator.createInstance per creare l'oggetto. Lo strumento per il quale sto creando l'oggetto COM è Tibco Spotfire v6.5.2 Per favore, aiutatemi. Grazie a – Prabhakar

+0

@Bill Menees, è possibile utilizzare la classe helper in [PowerShell per creare un'istanza di un oggetto COM] (http://stackoverflow.com/questions/41945859/use-powershell-to-create-instance-of-com-object)? – craig

Problemi correlati