3

我有一个由不再在公司工作并且不知道如何调试它的开发人员编写的 Visual Studio 插件。但我想添加一个功能,以便它可以递归到解决方案文件夹中。

听起来很简单,但我不确定 api 是否允许对此进行测试?好吧,必须有一种方法,因为 AnkhSVN 和 VisualSVN 与解决方案文件夹一起工作得很好。

StackOverflow 我正在就这个问题寻求一些帮助。

谢谢

笔记

- 我们正在使用解决方案文件夹来隐藏“依赖项目”,它们基本上是一个项目引用列表,我们在特定解决方案中可能不关心这些项目引用,并且默认情况下希望隐藏这些引用。

public class Connect : IDTExtensibility2, IDTCommandTarget
{

public void GetProjectLocations(DTE2 dte)
{

UIHierarchy UIH = dte.ToolWindows.SolutionExplorer;

try
{
     UIHierarchyItem UIHItemd = UIH.UIHierarchyItems.Item(1);
}
catch (Exception E)
{
  Debug.Write(E);
}

UIHierarchyItem UIHItem = UIH.UIHierarchyItems.Item(1);//this looks suspect to me

// Iterate through first level nodes.
for (int i = 1; i <= UIHItem.UIHierarchyItems.Count; i++)
{
  Project TempGeneralProjObj = dte.Solution.Item(i);  

  if (TempGeneralProjObj.Kind == PrjKind.prjKindCSharpProject)
  {
  }

}

}

}
4

2 回答 2

4

到目前为止,从我的测试来看,解决方案文件夹似乎会令人惊讶地转换为 Project 类型,一旦完成,Project.ProjectItems 属性将保存一个可能存在于该文件夹下的项目列表。简而言之,这是至少获取有关事物结构信息的一种方式。然而,问题是位于解决方案文件夹下的每个 ProjectItem 似乎都将 find 转换为 ProjectItem 类型,但似乎无法转换为 Project。

这就是我目前在循环中检测解决方案文件夹的方式。

if(project.Kind == "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}")
{
    // TODO: Do your thing
}

这也让我感到沮丧,我还注意到ActiveReports 如何处理解决方案文件夹中的一个错误,这与同一问题有关。

更新!

好的,所以我找到了解决方案,但我不能 100% 声称它,因为我在Macaw's Blog找到了大部分。

因此,看来我最初的发现是正确的,但是为了获得解决方案项下每个 ProjectItem 的实际项目类型,您需要在ProjectItem.SubProject属性下查看。

现在 Macaw 采用递归方法来遍历项目结构,我认为我通常也会推荐这种方法,但是在我的情况下,我想要一个方法实现来简单地注销项目的 XML 表示以进行简单的研究,所以我最终使用了 Stack执行。作为参考,您可以在下面找到我的代码,该代码成功地处理了至少一级解决方案文件夹,其中仅包含项目,没有其他专业解决方案项目。

        XElement rootNode = new XElement("Solution");
        rootNode.Add(new XAttribute("Name", _applicationObject.Solution.FullName));

        Stack<Project> projectStack = 
            new Stack<Project>(_applicationObject.Solution.Projects.Cast<Project>());

        while(projectStack.Count > 0)
        {
            var project = (Project)projectStack.Pop();
            var solutionItemName = "Project";

            if(project.Kind == "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}")
            {
                foreach(ProjectItem innerProject in project.ProjectItems)
                {
                    if(innerProject.SubProject != null)
                    {
                        projectStack.Push(innerProject.SubProject);
                    }
                }
                solutionItemName = "Folder";
            }

            var projectNode = new XElement(
                solutionItemName, 
                new XAttribute("Name", project.Name),
                new XAttribute("Kind", project.Kind)
                );
            rootNode.Add(projectNode);

            foreach(ProjectItem item in project.ProjectItems)
            {
                var itemNode = new XElement("Item", new XAttribute("Name", item.Name));
                projectNode.Add(itemNode);

                if(item.Properties == null)
                {
                    continue;
                }

                foreach(Property property in item.Properties)
                {
                    var propertyNode = new XElement(property.Name, property.Value);
                    itemNode.Add(propertyNode);
                }
            }
        }

根据这篇文章的事实以及其他插件中明显的错误,很明显这不是最直观的设计,但这是我们必须忍受的。

于 2009-08-13T14:00:13.843 回答
1

若要调试 Visual Studio 加载项,请将源代码加载到未运行加载项的 Visual Studio 副本中。然后,将项目配置为在“运行”项目时启动 Visual Studio 的第二个副本,然后第二个副本将运行,第一个能够断点并对其进行调试。

确保你有一个批处理文件(或等效文件)要清理,这样你就可以在没有插件的情况下随时恢复运行 VS。

有用的资源...

于 2009-04-03T05:51:44.707 回答