以编程方式构建项目

时间:2012-03-30 11:59:05

标签: c# msbuild

我需要以编程方式为.csproj构建一个项目,我正在动态创建。 在搜索Google时,我找到了MS为MSBuild Engine提供的类和API。有了这些信息,我创建了一个执行msbuild.exe然后读取输出的进程,但现在我想使用命名空间Microsoft.Build.Execution来构建项目。这是我的计划:

public class Compiler
{
   private static string locationOfMSBuilldEXE = "";
   public static void Build(string msbuildFileName)
   {
       BuildManager manager = BuildManager.DefaultBuildManager;

       ProjectInstance projectInstance = new ProjectInstance(msbuildFileName);
       var result = manager.Build(new BuildParameters() 
                {
                    DetailedSummary = true
                }, 
                new BuildRequestData(projectInstance, new string[] { "Build" }));
       var buildResult = result.ResultsByTarget["Build"];
       var buildResultItems = buildResult.Items;

       string s = "";
   }
}

结果显示这构建正常,但我需要知道编译的详细输出以及如何查看它。如果有人可以给我链接到MSBuild的好教程或书籍,那将会非常有用。

3 个答案:

答案 0 :(得分:14)

谢谢@ritchmelton。虽然我自己弄清楚了。 这是我的代码:我使用了内置的记录器ConsoleLogger

public class Compiler
    {
        private static string locationOfMSBuilldEXE = "";
        public static void Build(string msbuildFileName)
        {
            ConsoleLogger logger = new ConsoleLogger(LoggerVerbosity.Normal);
            BuildManager manager = BuildManager.DefaultBuildManager;

            ProjectInstance projectInstance = new ProjectInstance(msbuildFileName);
            var result = manager.Build(
                new BuildParameters() 
                {
                    DetailedSummary = true,
                    Loggers = new List<ILogger>(){logger}
                }, 
                new BuildRequestData(projectInstance, new string[] { "Build" }));
            var buildResult = result.ResultsByTarget["Build"];
            var buildResultItems = buildResult.Items;

            string s = "";
        }
    }

答案 1 :(得分:9)

如果您只想构建项目或解决方案,而不需要复杂的参数,则可以更简单地完成。伪代码:

using namespace Microsoft.Build.Evaluation;

var p = Project.Load("path to project");
p.SetGlobalProperty("Configuration", "Release");
p.Build(...);

就是这样! BuildParameters等适用于相当高级的场景。 Visual Studio本身使用它们。

Dan(msbuild dev)

答案 2 :(得分:8)

您需要向ILogger添加实现BuildParameters接口的类的实例。您可以在Microsft.Build.Logging命名空间中添加其中一个提供的记录器的新实例,或者您可以自己实现ILogger,因为它很小并且Microsoft.Build.Utilities命名空间中有一个帮助器类称为Logger,易于扩展。

Build loggers

ILogger interface

Logger helper