この関連する質問では、Visual Studio のデバッガーがSystem.__ComObject
参照のプロパティを列挙できることを指摘しました。これは、「ラッパーの型があいまいな場合に使用される非表示の型」です。たとえば、別のオブジェクトから取得したときに取得するオブジェクトの型です。 COM オブジェクトを作成し、自分でインスタンス化しないでください:
さらに、COM オブジェクトの識別子をイミディエイト ウィンドウに書き込むだけで、そのプロパティと値が同様にダンプされます。
これはVS2010の「ダイナミックビュー」とは別のものであることに注意してください.PIAIDispatch
と.NETリフレクションを使用せずにCOMリフレクションを使用してCOMオブジェクトのプロパティを列挙すると思います。私が使用しているオブジェクトは実装されていませんIDispatch
(また、実装もされていませんIProvideClassInfo
)。そのため、「動的ビュー」はそれらに関する情報を取得できません。
興味深いことに、SharpDevelopのデバッガーは s のメンバーSystem.__Comobject
(例: point.Envelope
) を一覧表示できず、厳密に型指定された RCW (例: point
) のみを一覧表示できます。
では、Visual Studio はどのようにそれを行うことができるのでしょうか?
この場合、プライマリ相互運用機能アセンブリがこれらのオブジェクトでサポートされるインターフェイスの定義とともに存在し、Visual Studio がリフレクションを使用してサポートされるインターフェイスとプロパティを列挙する可能性があるためだと思います。それは正確ですか?もしそうなら、それはどのように機能しますか?
まず、PIA にはどのようにアクセスしますか? 現在読み込まれている PIA のみを調べますか、それとも動的に読み込みますか (そうであれば、どのように)? 多くの可能性があるインターフェイスのうち、どのインターフェイスのプロパティを列挙するかをどのように決定するのでしょうか? 必ずしも最初のものではなく、1つだけを使用しているようです。私が使用している API (ArcObjects)のドキュメントから、これらのオブジェクトの既定のインターフェイスはIUnknown
であるため、既定のインターフェイスを使用しているだけではありません。
スクリーンショットの例では、メンバーを列挙しているインターフェイスは、IEnvelope
インターフェイスから継承するIGeometry
インターフェイスです。IGeometry
私のテストでは、PIA ですべてのインターフェイス タイプを列挙した場合に最初に表示される、代わりにのメンバーを列挙しないことを VS2010 はどのように認識しますか? 何か非常に巧妙なことが起こっているのでしょうか、それとも明らかな何かが欠けているのでしょうか?
私が尋ねている理由は、LINQPad の開発者が、VS がどのように機能するかを知っていれば、同じ機能を実装する意思があるように見えるからです。したがって、ここでの適切な回答は、その非常に人気のあるツールの改善に大いに役立つ可能性があります。