【问题标题】:Build visual studio solution from code从代码构建 Visual Studio 解决方案
【发布时间】:2014-03-06 14:45:59
【问题描述】:

我正在编写一个控制台应用程序以从 tfs 服务器获取解决方案,构建它并在 iis 上发布,但我一直在构建......

我找到了这个代码,它就像一个魅力

public static void BuildProject()
{
    string solutionPath = Path.Combine(@"C:\MySolution\Common\Common.csproj");

    List<ILogger> loggers = new List<ILogger>();
    loggers.Add(new ConsoleLogger());
    var projectCollection = new ProjectCollection();
    projectCollection.RegisterLoggers(loggers);
    var project = projectCollection.LoadProject(solutionPath);
    try
    {
        project.Build();
    }
    finally
    {
        projectCollection.UnregisterAllLoggers();
    }
}

但我的解决方案非常大,并且包含多个相互依赖的项目(例如,项目 A 引用了项目 B)

如何获得正确的顺序来构建每个项目? 有没有办法从 .sln 文件构建整个解决方案?

【问题讨论】:

  • 如果他们都在同一个解决方案中,你为什么要链接到彼此的 dll 而不是添加项目引用?
  • 我的意思是它们之间是相互联系的,所以我不能在没有之前构建另一个项目的情况下构建一个项目
  • 您是否需要编写此 buildrunner 的代码,而不是仅仅调用 MSBuild 来构建您的解决方案?与 TFS PowerShell Cmdlet 一起,您将拥有所需的一切。
  • 出于学习原因,我想知道是否有办法从代码中执行此操作...如果没有,我将使用devenv /build Debug Solution.sln

标签: c# visual-studio-2012 msbuild


【解决方案1】:

尝试使用以下代码加载解决方案并进行编译:

string projectFilePath = Path.Combine(@"c:\solutions\App\app.sln");

ProjectCollection pc = new ProjectCollection();

// THERE ARE A LOT OF PROPERTIES HERE, THESE MAP TO THE MSBUILD CLI PROPERTIES
Dictionary<string, string> globalProperty = new Dictionary<string, string>();
globalProperty.Add("OutputPath", @"c:\temp");

BuildParameters bp = new BuildParameters(pc);
BuildRequestData buildRequest = new BuildRequestData(projectFilePath, globalProperty, "4.0", new string[] { "Build" }, null);
// THIS IS WHERE THE MAGIC HAPPENS - IN PROCESS MSBUILD
BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, buildRequest);
// A SIMPLE WAY TO CHECK THE RESULT
if (buildResult.OverallResult == BuildResultCode.Success)
{              
    //...
}

【讨论】:

  • 是的,我在bogdangavril.wordpress.com/2012/03/15/…我上也找到了该代码......但它不起作用。它总是失败,即使我可以从 Visual Studio ide 手动构建解决方案
  • 您使用过的项目都在您的解决方案中吗?您是否通过添加引用/项目添加了所有引用的 dll(来自解决方案中您自己的项目)?我已经编译了一个像这样的相当大的解决方案......
  • 在您的示例中,您编译的是 csproj 而不是 sln,错字?
  • 您是否检查了您的 GlobalProperties,例如错误使用平台(如果您使用 x86 而不是任何 CPU)可能会导致构建失败。
  • 我发现它可能导致错误:输出路径是“全局”/bin/debug。但我的解决方案中的每个项目都需要一个 /bin/debug 文件夹
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多