以编程方式构建项目

Par*_*rma 14 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 = "";
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Par*_*rma 15

谢谢@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 = "";
        }
    }
Run Code Online (Sandbox Code Playgroud)


小智 9

如果您只想构建项目或解决方案,而无需精心设计的参数,则可以更简单地完成.伪代码:

using namespace Microsoft.Build.Evaluation;

var p = Project.Load("path to project");
p.SetGlobalProperty("Configuration", "Release");
p.Build(...);
Run Code Online (Sandbox Code Playgroud)

而已!BuildParameters等适用于相当高级的场景.Visual Studio本身使用它们.

丹(msbuild开发)

  • 真棒!请注意,MSBuild 14中的语法已经改变.它的新项目("项目路径")`. (4认同)

Rit*_*ton 8

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

构建记录器

ILogger界面

记录器助手