【问题标题】:How to handle Solutions, Projects and their contents in a VisualStudio extension如何在 VisualStudio 扩展中处理解决方案、项目及其内容
【发布时间】:2017-07-16 20:44:11
【问题描述】:

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

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

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

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

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

现在,我创建了一个基于 WPF_Toolwindow 示例的新项目,重命名并适应了我的需要(基本上,我创建了新的 GUID,重命名了命名空间并删除了我不会使用的东西)。此扩展在调试器中仍然有效。我什至卸载了实验实例中的所有内容,并从头开始调试扩展。

我想达到的目标:

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

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

【问题讨论】:

  • 第一个问题,你的意思是在项目项上动态添加上下文菜单吗?第二个问题,请尝试使用Roslyn从解决方案中获取相关类。
  • 第三个问题,你的意思是生成一个代码文件,并将该文件添加到项目中?
  • (1) 这些项目已经有一个上下文菜单,我想在这个菜单中添加一个新命令。 (2) 感谢罗斯林的提示,我去看看。 (3) 是的,基本上不用手动操作项目文件就可以在项目中添加文件就好了。

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


【解决方案1】:

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

如果您想在上下文菜单中添加子菜单,以下链接提供了完整示例

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

【讨论】:

  • 您在原始问题中的评论让我阅读了有关 Roslyn 的更多信息,这似乎正是我想要的。 VSX-Samples 包括我的上下文菜单需求 - 感谢您的提示,一定是把它们与 VSSDK-Samples 混淆了。 MZ-Tools 看起来很有趣,但我不想在学习期间买东西,而且 Roslyn 似乎已经很好地满足了我的需求。如果您可以添加一些有关如何对解决方案资源管理器中的选择更改做出反应的信息,我会接受您的回答。感谢您的有用回答:)
  • >如果您可以添加一些有关如何在解决方案资源管理器中对选择更改做出反应的信息,您是指解决方案资源管理器中的上下文菜单,如果是这样,我提供的链接是开源的,您可以免费下载。如果没有,请您详细描述一下。
  • 不,上下文菜单是问题的另一部分。我的意思是:我在解决方案资源管理器中单击当前解决方案,然后选择解决方案并触发像 SolutionNodeSelected 这样的事件。或者,我选择了一个项目并触发了类似的事件。我可以订阅这样的活动吗? Toolwindow 示例使用选择跟踪器来更新属性窗口的内容。也许我需要使用类似的东西,但我还想不通。
  • 非常感谢,看起来不错。目前,我无法尝试,因为我搞砸了我的解决方案(如果我自己不解决,我会发布一个单独的问题)。不管怎样,你的回答很有帮助。
  • 我的解决方案再次起作用,我继续使用上下文菜单。我创建了命令,并且可以通过单击相应的上下文菜单项来触发它们,但是在命令的MenuItemCallback 方法中,我没有关于打开上下文菜单的节点的任何信息。我在sender 参数中有OleMenuItem 并得到一个OleCommandService,我在那里看到一个ParentTarget 属性,它始终是null。如何在回调方法中获取SolutionProjectDocument 或类似对象?
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多