Как мне получить выходные каталоги из последней сборки? - PullRequest
7 голосов
/ 11 апреля 2011

Допустим, у меня есть решение с одним или несколькими проектами, и я только что начал сборку, используя следующий метод:

_dte.Solution.SolutionBuild.Build(true); // EnvDTE.DTE

Как я могу получить выходные пути для каждого только что построенного проекта? Например ...

C: \ MySolution \ Project1 \ Bin \ x86 \ Release \
C: \ MySolution \ Проект2 \ Bin \ Debug

Ответы [ 2 ]

9 голосов
/ 12 апреля 2011

Пожалуйста, не говорите мне, что это единственный способ ...

// dte is my wrapper; dte.Dte is EnvDte.DTE               
var ctxs = dte.Dte.Solution.SolutionBuild.ActiveConfiguration
              .SolutionContexts.OfType<SolutionContext>()
              .Where(x => x.ShouldBuild == true);
var temp = new List<string>(); // output filenames
// oh shi
foreach (var ctx in ctxs)
{
    // sorry, you'll have to OfType<Project>() on Projects (dte is my wrapper)
    // find my Project from the build context based on its name.  Vomit.
    var project = dte.Projects.First(x => x.FullName.EndsWith(ctx.ProjectName));
    // Combine the project's path (FullName == path???) with the 
    // OutputPath of the active configuration of that project
    var dir = System.IO.Path.Combine(
                        project.FullName,
                        project.ConfigurationManager.ActiveConfiguration
                        .Properties.Item("OutputPath").Value.ToString());
    // and combine it with the OutputFilename to get the assembly
    // or skip this and grab all files in the output directory
    var filename = System.IO.Path.Combine(
                        dir,
                        project.ConfigurationManager.ActiveConfiguration
                        .Properties.Item("OutputFilename").Value.ToString());
    temp.Add(filename);
}

Это заставляет меня хотеть рвать.

6 голосов
/ 27 февраля 2014

Вы можете попасть в выходные папки, пройдя по именам файлов в выходной группе Built каждого проекта в EnvDTE:

var outputFolders = new HashSet<string>();
var builtGroup = project.ConfigurationManager.ActiveConfiguration.OutputGroups.OfType <EnvDTE.OutputGroup>().First(x => x.CanonicalName == "Built");

foreach (var strUri in ((object[])builtGroup.FileURLs).OfType<string>())
{
  var uri = new Uri(strUri, UriKind.Absolute);
  var filePath = uri.LocalPath;
  var folderPath = Path.GetDirectoryName(filePath);
  outputFolders.Add(folderPath.ToLower());
}
...