10

この関連する質問では、Visual Studio のデバッガーがSystem.__ComObject参照のプロパティを列挙できることを指摘しました。これは、「ラッパーの型があいまいな場合に使用される非表示の型」です。たとえば、別のオブジェクトから取得したときに取得するオブジェクトの型です。 COM オブジェクトを作成し、自分でインスタンス化しないでください:

COM オブジェクトのデバッグ ビュー

さらに、COM オブジェクトの識別子をイミディエイト ウィンドウに書き込むだけで、そのプロパティと値が同様にダンプされます。

COM オブジェクト イミディエイト ウィンドウ

これはVS2010の「ダイナミックビュー」とは別のものであることに注意してください.PIAIDispatchと.NETリフレクションを使用せずにCOMリフレクションを使用してCOMオブジェクトのプロパティを列挙すると思います。私が使用しているオブジェクトは実装されていませIDispatch(また、実装もされていませんIProvideClassInfo)。そのため、「動的ビュー」はそれらに関する情報を取得できません。

ダイナミック ビュー

興味深いことに、SharpDevelopのデバッガーは s のメンバーSystem.__Comobject(例: point.Envelope) を一覧表示できず、厳密に型指定された RCW (例: point) のみを一覧表示できます。

SharpDevelop デバッガー

では、Visual Studio はどのようにそれを行うことができるのでしょうか?

この場合、プライマリ相互運用機能アセンブリがこれらのオブジェクトでサポートされるインターフェイスの定義とともに存在し、Visual Studio がリフレクションを使用してサポートされるインターフェイスとプロパティを列挙する可能性があるためだと思います。それは正確ですか?もしそうなら、それはどのように機能しますか?

まず、PIA にはどのようにアクセスしますか? 現在読み込まれている PIA のみを調べますか、それとも動的に読み込みますか (そうであれば、どのように)? 多くの可能性があるインターフェイスのうち、どのインターフェイスのプロパティを列挙するかをどのように決定するのでしょうか? 必ずしも最初のものではなく、1つだけを使用しているようです。私が使用している API (ArcObjects)のドキュメントから、これらのオブジェクトの既定のインターフェイスはIUnknownであるため、既定のインターフェイスを使用しているだけではありません。

スクリーンショットの例では、メンバーを列挙しているインターフェイスは、IEnvelopeインターフェイスから継承するIGeometryインターフェイスです。IGeometry私のテストでは、PIA ですべてのインターフェイス タイプを列挙した場合に最初に表示される、代わりにのメンバーを列挙しないことを VS2010 はどのように認識しますか? 何か非常に巧妙なことが起こっているのでしょうか、それとも明らかな何かが欠けているのでしょうか?

私が尋ねている理由は、LINQPad の開発者が、VS がどのように機能するかを知っていれば、同じ機能を実装する意思があるように見えるからです。したがって、ここでの適切な回答は、その非常に人気のあるツールの改善に大いに役立つ可能性があります。

4

1 に答える 1

2

これを行う方法は次のとおりです。

  • COM オブジェクトを取得しますIDispatch(別の可能なパスは次のとおりですIDispatchEx) 。
  • タイプ ライブラリへの参照を取得する --IDispatch::GetTypeInfo
  • タイプ ライブラリを読み込み、プロパティを列挙する
  • 検出されたプロパティの値について実オブジェクトをクエリ

追加の拡張機能が適用されます:IPersist*インターフェイスのファミリをクエリするかIProvideClassInfo、オブジェクトのタイプ ライブラリへの参照を取得してプロパティを検出します。

于 2013-02-10T13:49:15.660 に答える