このrelated questionでは、Visual StudioのデバッガはSystem.__ComObject
参照のプロパティを列挙できますが、これは「ラッパータイプがあいまいである場合に使用される隠し型」 - たとえば、取得時に取得するオブジェクトの型別のCOMオブジェクトから、それを自分でインスタンス化しません:Visual Studioのデバッガ/インタラクティブウィンドウは.NETのCOMオブジェクトのプロパティをどのようにダンプしますか?
をさらに、あなたは、単にイミディエイトウィンドウにCOMオブジェクトの識別子を記述する場合、そのプロパティと値も同様にダンプされています。
これは、VS2010の "Dynamic View"とは別のものですが、これはIDispatch
とCOMリフレクションを使用して、PIAと.NETリフレクションを使用せずにCOMオブジェクトのプロパティを列挙すると考えていることに注意してください。私が働いているオブジェクトがはIDispatch
を実装していない(また彼らはそのことについてIProvideClassInfo
を実装してください)、そのように、「ダイナミックビューは、」それらについてのあらゆる情報を入手することができません。
興味深いことに、SharpDevelopのデバッガは、System.__Comobject
(例:point.Envelope
)のメンバー、強く型付けされたRCW(例:point
)のメンバーをリストすることはできません。
それでは、どのようにVisual Studioは、それを行うことができるのですか?
この場合、プライマリ相互運用機能アセンブリにはこれらのオブジェクトでサポートされているインタフェースの定義が存在するため、Visual Studioはリフレクションを使用してサポートされているインタフェースとプロパティを列挙している可能性があります。それは正確ですか?もしそうなら、どのように機能しますか?
どのようにPIAにアクセスするのですか?現在ロードされているPIAのみを見ていますか、それともPIAを動的にロードしていますか?どのようなインタフェースが存在し、どのインタフェースがそのプロパティを列挙するかはどのようにして決定されますか?それは1つだけを使用するように見えますが、必ずしも最初のものではありません。私が(ArcObjects)で作業しているAPIのdocumentationから、これらのオブジェクトのデフォルトインターフェイスはIUnknown
なので、デフォルトインターフェイスだけではありません。
このスクリーンショットの例では、メンバーを列挙するインターフェイスはIEnvelope
インターフェイスで、IGeometry
インターフェイスを継承しています。 VS2010は、代わりにIGeometry
のメンバーを列挙しないことを知っていますが、私のテストでは、PIAのすべてのインターフェイスタイプを列挙すれば最初に表示されますか?非常に賢いことが起こっているのでしょうか、それとも明らかに何かが欠けているのでしょうか?
私が尋ねる理由は、VSがどのようにそれをしているかを知っていれば、LINQPadappears willingの開発者は同じ機能を実装するということです。だからここでの良い答えは、非常に人気のあるツールを改善するのに長い道のりを歩むことができます。
PointクラスのEnvelopeプロパティのタイプがPIAでIEnvelopeとして定義されているため、VSはそれをダンプすることができるため、特別なメカニズムは必要ありません。 –
本当に簡単ですか?この情報はデバッグ時にのみ利用可能ですか? (どのように)実行時に同じ情報を得ることができますか?そして、SharpDevelopのデバッガが同じことをしないのはなぜですか(おそらく気にしないでしょう)。 – blah238
はい、それはとても簡単です。 System._ComObjectだけを持っていると複雑ですが、ComImport .NETインターフェイスとしてキャストできたら、これらのインターフェイスレイアウトにアクセスできます。それはインテリセンスを含むすべての時間利用可能です。私はSharpDevelopについて知らない。 –