2

私は VS2010 の拡張機能を作成しています。私のパッケージIVsSelectionEventsは、ソリューション エクスプローラーでの選択を追跡するために実装されています。

    public int OnSelectionChanged(
        IVsHierarchy pHierOld,
        uint itemidOld,
        IVsMultiItemSelect pMISOld,
        ISelectionContainer pSCOld,
        IVsHierarchy pHierNew,
        uint itemidNew,
        IVsMultiItemSelect pMISNew,
        ISelectionContainer pSCNew)
    {
        if (pSCNew != null)
        {
            uint count;
            pSCNew.CountObjects((uint) Constants.GETOBJS_SELECTED, out count);
            object[] selectedObjects = new object[count];
            pSCNew.GetObjects((uint) Constants.GETOBJS_SELECTED, count, selectedObjects);

            // What is the type of this object?
            var selectedItem = selectedObjects[0] as ???;

        }
        return VSConstants.S_OK;
    }

GetObjectsオブジェクトの配列を埋めますが、これらのオブジェクトの実際のタイプはわかりませんGetTypeを返しますがSystem.__ComObject、これはあまり役に立ちません。これらのオブジェクトは既知のインターフェースを実装していると思いますが、どれがどれかを知るにはどうすればよいでしょうか? これはどこにも文書化されていないようです...現在dynamic、オブジェクトのプロパティにアクセスするために使用していますが、理想的ではありません。とにかく、このオブジェクトによってどのメソッドが公開されているかわかりません(ウォッチ ウィンドウのプロパティ)

ソリューション エクスプローラーのプロジェクト アイテムによって実装されているインターフェイスを知っている人はいますか?

4

1 に答える 1

1

わかりました。GetObjects によって返されるアイテムのタイプは のようFilePropertiesです。とにかく、代わりに EnvDTE を使用して、はるかに簡単なアプローチを見つけました...EnvDTE.ProjectItemオブジェクトは、このメソッドを使用して階層とアイテム ID から取得できます。

    private static ProjectItem GetProjectItem(IVsHierarchy hierarchy, uint itemId)
    {
        object o;
        if (hierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_ExtObject, out o) == VSConstants.S_OK)
        {
            return o as ProjectItem;
        }
        return null;
    }
于 2011-11-28T18:44:06.643 に答える