2012-05-16 21 views
14

C#でCOMオブジェクトを反映させてすべてのプロパティ名を読み取るにはどうすればよいですか? 私は名前を知っていればプロパティを取得する方法を知っています。COMオブジェクトを反映させてプロパティ名を取得

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

しかし、すべてのプロパティをダンプしたいときは何ですか?

PropertyInfo[] properties = t.GetProperties(); 

この方法では、Com-Objectsでは機能しませんでした。私はGetMembers()私はこれらのメンバーを取得するならば:

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

よろしくクリス

+2

に応じてStackOverflowの上DispatchUtilityのソースコードのバージョンを提供してきました。 'GetProperties'は型のすべてのプロパティを返します。 –

+0

まあ、 'PropertyInfo.Name'? –

+2

しかし、COMオブジェクトではありません! –

答えて

12

をあなたは、RCWのための基礎となる.NETクラスを__ComObjectクラスのメンバーを得ました。

COMコクラスがIDispatch、Automationインターフェイスを実装している限り、COMには反映のためのビットサポートがあります。珍しいことではなく、スクリプト言語が呼び出しを行うために使用するインターフェイスです。 IDispatch.GetIDsOfNames()は常に実装されていますが、メンバーの名前を前もって知っておく必要があります。 IDispatch.GetTypeInfo()は、コクラスの型ライブラリへのアクセスを提供しますが、必ずしも実装されているわけではありません。メタデータへの型ライブラリ情報の変換は、不完全な芸術であり、.NETがTlbimp.exeでこれを前もって行うことを望んでいる中心的な理由です。ランタイム・アプローチを追求したい場合は、Tlbimpの管理バージョンのソースであるavailable hereの恩恵を受けるでしょう。

ビルド時にこれを行うのが常にベストです。タイプライブラリ(通常は実行可能ファイルに埋め込まれています)への参照を追加するか、Tlbimp.exeを自分で実行してください。今度は、基礎となるCOMコクラスとインターフェイスのすべてのメンバーを持つ.NET相互運用機能ラッパークラスを取得しました。どの時点でもう反射はもう必要ないでしょうか?

10

私はちょうどReflection with IDispatch-based COM objectsの方法に関するCodeProjectの記事を公開しました。この記事では、他のプロジェクトに簡単に組み込むことができる小さなC#DispatchUtilityヘルパクラスを提供しています。内部的には、IDispatchのカスタム宣言と.NETのTypeToTypeInfoMarshalerを使用して、IDispatchのITypeInfoをリッチな.NET Typeインスタンスに変換します。

例では、DispatchUtility.GetType(comObject, true)を呼び出して.NET Typeインスタンスを取得し、GetPropertiesまたはGetMembersを呼び出すことができます。

は、私はまた、あなたが既に答えを提供しているので、それは、あなたが求めているものは明らかではありませんHow to enumerate members of COM object in C#?

+0

素晴らしい記事ありがとうございます。私はそれを使ってみましたが、問題に直面しました。 "タイプライブラリがCLRアセンブリからエクスポートされたため、インポートすることができません" Activator.createInstanceを使用してオブジェクトを作成しています。私がCOMオブジェクトを作成しているツールは、Tibco Spotfire v6.5.2です。 助けてください。 Thanks – Prabhakar

+0

@Bill Menees、あなたのヘルパークラスを[COMオブジェクトのインスタンスを作成するためにPowerShell]で使用できますか?(http://stackoverflow.com/questions/41945859/use-powershell-to-create-instance-of-com-object )? – craig

関連する問題