从代码构建Visual Studio解决方案

3
我正在编写一个控制台应用程序,从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 呢? - Kippie
我的意思是它们彼此之间是相互关联的,因此在构建一个项目之前,我无法构建另一个项目。 - Doc
你需要编写这个构建运行器的具体原因是什么,而不是直接调用MSBuild来构建你的解决方案?结合TFS PowerShell Cmdlets,你将拥有所需的一切。 - Filburt
我想知道是否有一种方法可以通过代码进行学习目的来完成这个任务... 如果没有,我将使用 devenv /build Debug Solution.sln - Doc
1个回答

9
尝试使用以下代码加载解决方案并编译它:
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)
{              
    //...
}

你的解决方案中是否包含了所有使用的项目?你是否通过“添加引用/项目”方式添加了所有自己项目中所需的dll文件?我就是这样编译了一个相当大的解决方案... - Erwin
我使用了sln,它有效了,你尝试添加日志记录器来查看编译抛出的错误了吗? - Erwin
1
你有检查过 GlobalProperties 吗?例如,如果你使用 x86 而不是 Any CPU,可能会导致构建失败。 - Erwin
请尝试使用GlobalProperty.Add("Platform", "Any CPU");,在Any和CPU之间加上一个空格。 - Erwin
1
我发现引起错误的原因:输出路径是“全局”的/bin/debug。但是我需要在解决方案中每个项目都有一个/bin/debug文件夹。 - Doc
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接