[英]Visual Studio 2008 Add-In Check if Hierarchy Item is solution folder
我有一个由开发人员编写的视觉工作室插件,他不再在公司工作,也不知道如何调试它。 但我想添加一个功能,以便它可以递归到解决方案文件夹中。
听起来很简单,但我不确定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)
{
}
}
}
}
到目前为止,我的测试看起来解决方案文件夹将被强制转换为类型Project,一旦完成,Project.ProjectItems属性将保存该文件夹下可能存在的Projects列表。 简而言之,这是至少获取有关事物结构的信息的一种方法。 但问题是,位于解决方案文件夹下的每个ProjectItem似乎都会将find强制转换为类型ProjectItem,但似乎无法强制转换为Project。
这就是我目前在循环中检测解决方案文件夹的方式。
if(project.Kind == "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}")
{
// TODO: Do your thing
}
这也令我感到沮丧,我也注意到ActiveReports处理解决方案文件夹的错误也与此相关。
UPDATE!
好的,所以我找到了解决方案,但我不能100%声称它,因为我在Macaw的Blog上发现了大部分内容。
所以看起来我的原始发现是正确的,但是为了获得解决方案项下每个ProjectItem的实际项目类型,您需要在ProjectItem.SubProject属性下查看。
现在,Macaw采用递归方式来处理项目结构,我认为我通常也会建议这样做。但是在我的情况下,我希望单个方法实现只是为了简单的研究目的而简单地注销项目的XML表示,所以我最终使用了一个堆栈实现。 作为参考,您可以在下面找到我的代码,该代码成功处理至少一个级别的解决方案文件夹,仅包含项目而没有其他专业解决方案项目。
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);
}
}
}
根据这篇文章的事实以及其他插件中明显的错误,显然这不是最直观的设计,但这就是我们必须忍受的。
若要调试Visual Studio加载项,请将源代码加载到未运行加载项的visual studio副本中。 然后,配置项目以在“运行”项目时启动Visual Studio的第二个副本,然后第二个副本将运行第一个能够断点并调试它。
确保您有一个批处理文件(或等效文件)来清理,这样您就可以在没有插件的情况下返回运行VS.
有用的资源......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.