对于我们的一个主要系统,我们有一个很大的解决方案,我们终于做了一些应该在很久以前完成的事情,但是嘿。
- 主
- 发展(新发展)
- Service Pack(错误修复)
- 释放(锁定,与客户有关)
我们刚刚得到了我们的主要解决方案,我们已经无错误(经过测试并为客户准备好了签名),所以现在正是实现这一目标的最佳时机。我们的主要解决方案是这样的:
- 主
- 项目A.
- 参考A(C:\ DLLS)
- 参考B(C:\ DLLS)
- 项目B(参考本地)
- 项目B.
- 参考A(C:\ DLLS)
- 参考B(C:\ DLLS)
如果我们有直接的关系项目,它们往往是我们应用程序的模块,并在本地引用(项目B)。外部引用是自定义实用程序类,它们不驻留在解决方案中,因此构建并放在一个文件夹中(如果我们现在只有一个解决方案而不考虑分支,这很好)。
问题
现在的问题是我正在分支,每个分支都将引用一个部分,并且代码不能在逐个分支的基础上进行更改。我希望能够加载当前MAIN
并查看它有哪些参考资料以及它们在解决方案中的位置,我尝试使用reflection
和Assemblies
作为{{1}但是,它只提供引用的.DLL的信息,例如它们的名称,而不是项目期望它们的位置。然后我继续看MAIN.EXE
Microsoft.Build.BuildEngine
哪个不是正确的东西。基本上我正在尝试获取给定项目文件的参考位置列表,我可以做什么可能的建议?
答案 0 :(得分:3)
我使用Microsoft.Build.BuildEngine
赢得了胜利者 - 每个引用都是BuildItem
,MetaData
名为HintPath
,这就是我需要的内容。对于任何想要尝试这个的人:
Project p = new Project();
p.Load(_projectPath);
var buildItems = p.ItemGroups.Cast<BuildItemGroup>().Where(x => x.Cast<BuildItem>().Any(y => y.Name.ToLower().Contains("reference"))).Select(x => x.Cast<BuildItem>()).ToList();
var buildItemPaths = buildItems.SelectMany(x => x.Select(y => y.GetMetadata("HintPath").ToString())).ToList<string>();
这给了我所需要的东西 - 希望也帮助其他人。