2012-06-15 6 views
5

Visual Studio 2010(vsix)用のカスタマイズパッケージを作成しています。ソリューションエクスプローラから選択したプロジェクト

私が行う必要があるのは、ソリューションエクスプローラのプロジェクトノードにコンテキストメニューボタンを追加することです。

プロジェクトノードを右クリックするとコンテキストメニューが表示されるようになりましたが、次の課題は、クリックされたプロジェクトオブジェクトへの参照を取得することです。現在、以下のコードを使用して、IDEでアクティブなドキュメントを調べることでプロジェクトを手に入れることができます。

私の質問は、ソリューションエクスプローラで選択したプロジェクトと同様の参照を取得するにはどうすればいいですか?

答えて

11

私はそれを理解しました。情報を共有することもあります。

SVsShellMonitorSelectionサービスを使用すると、選択した階層への参照をIVsHierarchyとして取得できます。これにより、選択したオブジェクトへの参照を取得できます。ソリューションエクスプローラで選択した内容に基づいて、Project,ProjectItemなどのクラスにキャストすることができます。ハンディ!

IntPtr hierarchyPointer, selectionContainerPointer; 
Object selectedObject = null; 
IVsMultiItemSelect multiItemSelect; 
uint projectItemId; 

IVsMonitorSelection monitorSelection = 
     (IVsMonitorSelection)Package.GetGlobalService(
     typeof(SVsShellMonitorSelection)); 

monitorSelection.GetCurrentSelection(out hierarchyPointer, 
            out projectItemId, 
            out multiItemSelect, 
            out selectionContainerPointer); 

IVsHierarchy selectedHierarchy = Marshal.GetTypedObjectForIUnknown(
            hierarchyPointer, 
            typeof(IVsHierarchy)) as IVsHierarchy; 

if (selectedHierarchy != null) 
{ 
    ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(
             projectItemId, 
             (int)__VSHPROPID.VSHPROPID_ExtObject, 
             out selectedObject)); 
} 

Project selectedProject = selectedObject as Project; 

Here's the source

+0

私はこれを見つけたので、満足している、これを行う方法をどこか他の所に見つけることができませんでした。 :D – bio595

+1

私はMarshal.Release(hierarchyPtr)が不足していると思います。 Marshal.Release(selectionContainerPointer); 'を呼び出し、メモリリークを回避します。そうでなければ素晴らしい! – MickyD

+0

これは明らかかもしれませんが、IntPtrの初心者ユーザとして、nullポインタの例外を避けるためにMarshal.Releaseを呼び出す前にselectionContainerPointer == IntPtr.Zeroをチェックできることを指摘する価値があります。 – webjprgm

関連する問題