2

对于我们的一个主要系统,我们有一个相当大的解决方案,我们终于做了一些很久以前应该做的事情,但是嘿。

  • 主要的
    • 开发(新开发)
    • 服务包(错误修复)
      • 释放(锁定,目前与客户有关)

我们刚刚获得了我们的主要解决方案,使其无错误(经过测试并为客户签名准备就绪),因此现在是实施该解决方案的正确时机。然而,我们的主要解决方案是这样的:

  • 主要的
    • 项目A
      • 参考 A (C:\DLLS)
      • 参考 B (C:\DLLS)
      • 项目B(本地参考)
    • 项目 B
      • 参考 A (C:\DLLS)
      • 参考 B (C:\DLLS)

在我们有直接关系项目的地方,它们往往是我们应用程序的模块并在本地引用(项目 B)。外部引用是自定义实用程序类,它们不驻留在解决方案中,因此被构建并放在一个文件夹中(如果我们只有一个解决方案而不是现在我们正在考虑分支,这很好)。

问题

现在的问题是我正在分支,每个分支都将引用一个部分,并且不能逐个分支地更改代码。我希望能够加载当前MAIN并查看它有哪些引用以及它们在解决方案中的位置,我尝试使用reflectionand但这仅Assemblies提供MAIN.EXE引用的 .DLL 的信息,例如它们的名称而不是项目所在的位置期待他们成为。然后我继续看Microsoft.Build.BuildEngine

  Project p = new Project();
  //This is the cs/vb project file
  p.Load(_projectPath);
  var v = p.Imports;

这不是正确的。本质上,我正在尝试获取给定项目文件的参考位置列表,关于我能做什么的任何可能的建议?

4

1 回答 1

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>();

这给了我我需要的东西——希望也能帮助其他人。

于 2012-10-17T11:34:24.823 回答