首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Microsoft.Build以编程方式构建项目失败

使用Microsoft.Build以编程方式构建项目失败
EN

Stack Overflow用户
提问于 2018-02-26 10:41:29
回答 3查看 703关注 0票数 0

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

代码语言:javascript
复制
Microsoft.Build
Microsoft.Build.Framework
Microsoft.Build.Tasks.Core
Microsoft.Build.Utilities.Core

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

代码语言:javascript
复制
        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;
        }

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

为什么会发生这种事,我该怎么解决呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-01 10:15:10

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

代码语言:javascript
复制
            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)中,正确的路径是示例代码中的路径。

票数 0
EN

Stack Overflow用户

发布于 2018-02-26 10:51:22

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

代码语言:javascript
复制
<MSBuildExtensionsPath>C:\Program Files (x86)\MSBuild</MSBuildExtensionsPath>
票数 0
EN

Stack Overflow用户

发布于 2018-02-27 06:37:10

一个BuildRequestData构造函数重载支持一个名为"toolVersion“的参数。由于您使用的是2017,所以将其设置为"15.0“。

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

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

相反,我使用的是这里的一个:

C:\程序文件(x86)\MSBuild{version}\Bin

此版本提供额外的参数,如LangVersionDeployOnBuild

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48986544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档