如何在VisualStudio扩展中处理解决方案,项目及其内容

时间:2017-07-16 20:44:11

标签: wpf visual-studio-2017 visual-studio-extensions

简而言之: 我是VisualStudio Extensibility的新手,我的目标是使用ToolWindow创建一个扩展(已经可以工作),为VisualStudio解决方案的每个上下文显示不同的视图。即解决方案的视图,项目的视图等。应通过单击解决方案资源管理器,类视图,对象浏览器的上下文菜单中的上下文菜单条目以及(理想情况下)显示内容的任何其他窗口来打开窗口。项目,命名空间,类等。

搜索后我发现了很多信息,但对于某些观点,我找不到非常有用的信息。我怎么......

  • ...为VisualStudio视图创建上下文菜单项?
  • ...将当前打开的解决方案作为代码中的实例?
  • ...将解决方案的项目及其竞争作为代码中的实例?
  • ...在代码中添加/删除解决方案/项目/类/ ...中的项目?
  • ...对解决方案资源管理器中的选择更改做出反应?

到目前为止我做了什么: 我阅读了Starting to Develop Visual Studio Extensions的文档并下载了VSSDK-Extensibility-Samples。特别是WPF_Toolwindow示例对我的目的来说很有意思,所以我构建并运行它,到目前为止成功了。另一个有趣的示例是WPFDesigner_XML,但它总是抛出NullReferenceException,所以我决定坚持使用以前的ToolWindow,这完全没问题。

更进一步,我试图通过仔细查看项目中的每个文件,在调试器中运行它并分析发生的事情来理解该示例。我有信心我理解它,但我也愿意纠正我可能被误导的想法。

现在,我已经创建了一个基于WPF_Toolwindow示例的新项目,根据我的需要进行了重命名和调整(基本上,我创建了新的GUID,重命名了名称空间并删除了我不会使用的内容)。此扩展仍可在调试器中使用。我甚至从实验实例中卸载了所有内容,并从头开始调试扩展。

我尝试实现的目标:

  • 当解决方案资源管理器(或任何其他VisualStudio视图)中的选择发生更改时,让ToolWindow加载特定的视图/视图模型。或者,解决方案资源管理器树(或任何其他VisualStudio视图)中的每个节点的上下文菜单都应该有一个上下文菜单项。
  • 获取当前打开的解决方案,包含项目以及解决方案资源管理器内容中的所有内容,作为我的viewmodel中可处理的实例。我需要正确添加/删除
    • 类/结构/枚举到/来自
      1. 项目中的文件夹
      2. 命名空间
    • 属性/字段到/来自类/结构
  • 根据解决方案的信息生成代码,并将文件正确添加到项目中。

有没有人知道这样的例子,或者有人能给我一些提示,我可以在哪里找到更多信息?任何帮助,将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

(1)这些项目已经有了一个上下文菜单,我想在这个菜单中添加一个新命令。

如果要将子菜单添加到上下文菜单,以下链接提供了完整的示例 enter image description here

https://github.com/visualstudioextensibility/VSX-Samples/tree/master/CommandSubmenu

  

(3)是的,基本上将文件添加到项目而不手动操作项目文件会很好。

您可以通过Project.ProjectItems.AddFromFile将该文件添加到项目中,以下提供了一个示例供您参考。

https://www.mztools.com/Articles/2014/MZ2014009.aspx

更新

  

我选择了一个项目并触发了类似的事件。我可以订阅这样的活动吗?

您可以使用IVsMonitorSelection来实现。这是检索相关项目路径的代码供您参考。

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;

有关用法的更多信息,请参阅:

https://www.mztools.com/articles/2007/mz2007024.aspx