【问题标题】:Building Project Programmatically Fails Using Microsoft.Build使用 Microsoft.Build 以编程方式构建项目失败
【发布时间】:2018-02-26 10:41:29
【问题描述】:

我将以下三个包安装到我的控制台应用程序中:

Microsoft.Build
Microsoft.Build.Framework
Microsoft.Build.Tasks.Core
Microsoft.Build.Utilities.Core

我尝试使用以下方法构建项目:

        static void Build(string projectPath)
        {
            var logger = new ConsoleLogger(LoggerVerbosity.Normal);
            logger.ShowSummary = true;
            var manager = BuildManager.DefaultBuildManager;

            var projectInstance = new ProjectInstance(projectPath);
            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;
        }

但是,在我运行代码后,我得到了下图中描述的错误:

为什么会发生这种情况,我该如何解决?

【问题讨论】:

    标签: c# .net microsoft.build


    【解决方案1】:

    我认为您没有使用正确的 MSBuild 版本。尝试在 .proj 中明确设置变量:

    <MSBuildExtensionsPath>C:\Program Files (x86)\MSBuild</MSBuildExtensionsPath>
    

    【讨论】:

    • 我的应用程序的App.config 中没有任何MSBuildExtensionPath 配置
    • 检查“YourAppName.csporj”而不是“app.config”
    • 您能否在一段工作代码中提及更多细节?比如这个标签有什么作用,我应该把它放在哪里?
    【解决方案2】:

    似乎最好的解决方案是在Process 类中使用MSBuild 命令行。工作示例如下:

                var buildOutput = new List<string>();
                var buildError = new List<string>();
                var buildProcess = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\MSBuild\\15.0\\Bin\\MSBuild.exe",
                        Arguments = projectPath + " /t:Rebuild /p:Configuration=Debug",
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        RedirectStandardError = true,
                        CreateNoWindow = true
                    }
                };
    
                buildProcess.Start();
                while (!buildProcess.StandardOutput.EndOfStream)
                {
                    buildOutput.Add(buildProcess.StandardOutput.ReadLine());
                }
                while (!buildProcess.StandardError.EndOfStream)
                {
                    buildError.Add(buildProcess.StandardError.ReadLine());
                }
    

    然后您可以使用输出来确定构建是否成功。重要的注意事项是您必须找到 MSBuild.exe 文件的正确路径,因为该文件有多个版本,在我的情况下(VS 2017),正确的路径是示例代码中的路径。

    【讨论】:

      【解决方案3】:

      BuildRequestData 构造函数重载之一支持名为“toolVersion”的参数。由于您使用的是 Visual Studio 2017,请将其设置为“15.0”。

      编辑:我退出了使用 .Net Framework 提供的 MSBuild 版本(位于此处的版本): System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()

      C:\Windows\Microsoft.NET\Framework\v4.0.30319

      相反,我使用的是位于此处的那个:

      C:\Program Files (x86)\MSBuild\{version}\Bin

      此版本提供额外的参数为LangVersionDeployOnBuild

      【讨论】:

      • 那个构造函数重载需要其他参数globalPropertieshostServices应该设置成什么?
      • 谢谢,我测试了您的解决方案,但没有解决我的问题。顺便说一句,我已经更改了屏幕截图。你能看一下吗?
      • 看起来您有构建后事件。可能吗?我还没有找到如何处理它们......如果我在下周找到答案,我会更新这个答案。
      • 我不这么认为,我尝试了很多不同的方法,但没有一个适合我
      猜你喜欢
      • 2017-10-30
      • 1970-01-01
      • 2017-08-22
      • 2011-07-24
      • 2020-02-26
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2020-10-21
      相关资源
      最近更新 更多