Visual Studio扩展获取项目路径

时间:2017-07-18 13:36:27

标签: c# visual-studio-2017 visual-studio-extensions

我正在为Visual Studio 2017编写扩展程序,该扩展程序可在项目的上下文菜单中使用(通过右键单击等),使用

IDM_VS_CTXT_PROJNODE

我的问题是我何时进入

private void MenuItemCallback(object sender, EventArgs e)       

如何获得项目路径?

1 个答案:

答案 0 :(得分:5)

请检查以下代码,它们使用SVsShellMonitorSelection服务,您可以将所选层次结构的引用作为IVsHierarchy,这反过来允许我获得对所选对象的引用。然后,可以根据在解决方案资源管理器中选择的内容将其强制转换为Project,ProjectItem等类。

private void MenuItemCallback(object sender, EventArgs e)
        {
            string message = string.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", this.GetType().FullName);
            string title = "ItemContextCommand";

            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;

            string projectPath = selectedProject.FullName;

            // Show a message box to prove we were here
            VsShellUtilities.ShowMessageBox(
                this.ServiceProvider,
                message,
                projectPath,
                OLEMSGICON.OLEMSGICON_INFO,
                OLEMSGBUTTON.OLEMSGBUTTON_OK,
                OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
        }