Addin使用“打开相应的解决方案”扩展解决方案资源管理器?

时间:2010-04-22 07:53:22

标签: visual-studio add-in contextmenu solution-explorer

想象一个文件夹结构,其中包含超过200个解决方案文件,这些文件都属于一个软件。他们中的大多数生成共享库,这些库在自己的解决方案中包含的其他项目中引用。

如果有可能在解决方案资源管理器中右键单击这样一个引用的程序集然后有一个上下文菜单项,例如“Open solution”和“在新的Visual Studio实例中打开解决方案”,那会不会很好(这样的事情)?

为此,应该使用某种基本目录配置插件。从那里,它需要创建所有可用解决方案文件和包含项目的集合。右键单击引用时,它应扫描项目文件以查找相应的输出,如果找到,则显示用于直接打开相应解决方案的菜单项(也许这些信息也可以预取)。

嗯......你们中的任何人都已经创造了这样的插件吗?有没有人碰巧知道一个已经做过类似事情的插件?

如果这些问题都没有用“是”回答: 任何人都可以指出我如何根据设置的前提条件扩展解决方案资源管理器上下文菜单的方向吗?

1 个答案:

答案 0 :(得分:0)

Afaik你不能用VS MEF扩展来做到这一点,但使用VS加载项可能并不是那么困难。

  1. 使用MZTools样本/模板将要添加菜单的部分写入相应的命令栏(这是包含解决方案资源管理器命令的上下文菜单弹出窗口)。我联系到的是SolutionProject。我想还有一个名为Reference的commandBar。在以下代码中ApplicationObject的类型为EnvDTE以下是搜索所需命令栏的一些代码:

        private void IterateAllCommandBars( )
    {
        var commandBars =(CommandBars)ApplicationObject.CommandBars;
        Debug.Indent( );
        foreach (CommandBar commandBar in commandBars)
        {
            Debug.WriteLine(commandBar.Name);
        }
        Debug.Unindent( );
    }
    
  2. 加载扩展程序后(通常在OnStartupComplete中),您可以查找前置条件并设置一个字典,将引用映射到解决方案路径。

  3. 使用在添加时调用的QueryStatus调用,根据选择的引用启用/禁用菜单(如果有)。例如,如果有的话,我会得到所选的项目:

    private static Project GetProject(DTE applicationObject)
    {
        if (applicationObject.Solution==null||applicationObject.Solution.Projects==null||applicationObject.Solution.Projects.Count<1)
            return null;
        if (applicationObject.SelectedItems.Count==1&&applicationObject.SelectedItems.Item(1).Project!=null)
            return applicationObject.SelectedItems.Item(1).Project;
        return null;
    }
    
  4. 当用户单击有效选项时,执行要调用的命令。我不确定如何或者你是否可以在现有的VS实例中打开解决方案,但在新VS中打开会很容易。 Process.Start(ProjectFullPath);或者可能是SolutionFullPath。