2013-02-10 13 views
9

このrelated questionでは、Visual StudioのデバッガはSystem.__ComObject参照のプロパティを列挙できますが、これは「ラッパータイプがあいまいである場合に使用される隠し型」 - たとえば、取得時に取得するオブジェクトの型別のCOMオブジェクトから、それを自分でインスタンス化しません:Visual Studioのデバッガ/インタラクティブウィンドウは.NETのCOMオブジェクトのプロパティをどのようにダンプしますか?

COM Object Debug View

をさらに、あなたは、単にイミディエイトウィンドウにCOMオブジェクトの識別子を記述する場合、そのプロパティと値も同様にダンプされています。

COM Object Immediate Window

これは、VS2010の "Dynamic View"とは別のものですが、これはIDispatchとCOMリフレクションを使用して、PIAと.NETリフレクションを使用せずにCOMオブジェクトのプロパティを列挙すると考えていることに注意してください。私が働いているオブジェクトがIDispatchを実装していない(また彼らはそのことについてIProvideClassInfoを実装してください)、そのように、「ダイナミックビューは、」それらについてのあらゆる情報を入手することができません。

Dynamic View

興味深いことに、SharpDevelopのデバッガは、System.__Comobject(例:point.Envelope)のメンバー、強く型付けされたRCW(例:point)のメンバーをリストすることはできません。

SharpDevelop debugger

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

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

どのようにPIAにアクセスするのですか?現在ロードされているPIAのみを見ていますか、それともPIAを動的にロードしていますか?どのようなインタフェースが存在し、どのインタフェースがそのプロパティを列挙するかはどのようにして決定されますか?それは1つだけを使用するように見えますが、必ずしも最初のものではありません。私が(ArcObjects)で作業しているAPIのdocumentationから、これらのオブジェクトのデフォルトインターフェイスはIUnknownなので、デフォルトインターフェイスだけではありません。

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

私が尋ねる理由は、VSがどのようにそれをしているかを知っていれば、LINQPadappears willingの開発者は同じ機能を実装するということです。だからここでの良い答えは、非常に人気のあるツールを改善するのに長い道のりを歩むことができます。

+0

PointクラスのEnvelopeプロパティのタイプがPIAでIEnvelopeとして定義されているため、VSはそれをダンプすることができるため、特別なメカニズムは必要ありません。 –

+0

本当に簡単ですか?この情報はデバッグ時にのみ利用可能ですか? (どのように)実行時に同じ情報を得ることができますか?そして、SharpDevelopのデバッガが同じことをしないのはなぜですか(おそらく気にしないでしょう)。 – blah238

+0

はい、それはとても簡単です。 System._ComObjectだけを持っていると複雑ですが、ComImport .NETインターフェイスとしてキャストできたら、これらのインターフェイスレイアウトにアクセスできます。それはインテリセンスを含むすべての時間利用可能です。私はSharpDevelopについて知らない。 –

答えて

2

これはそれを行う方法です:

  • ライブラリを入力するための参照を取得し、COMオブジェクトのIDispatch(代替可能なパスがIDispatchExある)
  • を得る - IDispatch::GetTypeInfo
  • ロードタイプライブラリをし、プロパティ
  • を列挙します
  • 検索されたプロパティの値の実際のオブジェクト

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

+0

私が書いたように、これらのオブジェクトによってこれらのインタフェースは実装されていません。実際にそれらのいくつかは 'IPersist'を実装しますが、全てを実装するわけではありません。私はVS2010がどのようなものを見つけることができるのかを比較するためにチェックする必要があります。 – blah238

+0

'IDispatchEx'、' IProvideClassInfo2'(これは典型的なもので、 'IProvideClassInfo'ではありません) - 何かがあるはずです –

+0

いいえ、どちらもそうではありません。 – blah238

関連する問題