19

C# で 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

よろしくクリス

4

2 に答える 2

13

RCW の基になる .NET クラスである __ComObject クラスのメンバーを取得しました。

COM コクラスがオートメーション インターフェイスである IDispatch を実装している限り、COM はリフレクションをわずかにサポートします。珍しいことではありませんが、スクリプト言語が呼び出しを行うために使用するインターフェイスです。IDispatch.GetIDsOfNames() は常に実装されていますが、事前にメンバーの名前を知っておく必要があります。IDispatch.GetTypeInfo() は、コクラスのタイプ ライブラリへのアクセスを提供しますが、常に実装されているわけではありません。タイプ ライブラリ情報のメタデータへの変換は不完全な技術であり、.NET が Tlbimp.exe を使用して事前にこれを行うことを望んでいる主な理由です。ランタイム アプローチを追求したい場合は、こちらから入手できるマネージド バージョンの Tlbimp のソースが役立つ可能性があります。

ビルド時に事前にこれを行うのが常に最善です。これを行うには、タイプ ライブラリ (通常は実行可能ファイルに埋め込まれます) への参照を追加するか、自分で Tlbimp.exe を実行します。これで、基になる COM コクラスとインターフェイスのすべてのメンバーを持つ .NET 相互運用ラッパー クラスを取得できました。その時点で、おそらくリフレクションはもう必要ありません:)

于 2012-05-16T11:22:18.050 に答える
12

IDispatch ベースの COM オブジェクトでリフレクションを行う方法に関する CodeProject の記事を公開しました。この記事では、他のプロジェクトに簡単に組み込むことができる小さな C#DispatchUtilityヘルパー クラスを提供します。内部的には、IDispatch のカスタム宣言と .NET の TypeToTypeInfoMarshaler を使用して、IDispatch の ITypeInfo を豊富な .NET Type インスタンスに変換します。

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

また、「C# で COM オブジェクトのメンバーを列挙する方法」への回答として、StackOverflow で DispatchUtility ソース コードのバージョンを提供しました。

于 2013-01-08T03:42:57.533 に答える