6

Visual Studio 2010 (vsix) のカスタマイズ パッケージを作成しています。

ソリューション エクスプローラーのプロジェクト ノードにコンテキスト メニュー ボタンを追加する必要があります。

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

DTE dte = (DTE)ServiceProvider.GlobalProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;

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

4

1 に答える 1

12

私はそれを考え出した。情報を共有することもできます。

この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;

これがソースです

于 2012-06-16T06:46:09.157 に答える