Создание программного сбоя проекта с помощью Microsoft.Build

Я установил три следующих пакета в свое консольное приложение:

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;
        }

Однако после запуска кода я получил ошибку, описанную на следующем рисунке:

Почему это происходит и как я могу это исправить?

3 ответа

Решение

Кажется, лучшим решением является использование MSBuild командная строка в Process учебный класс. Рабочий образец выглядит следующим образом:

            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) правильный путь - тот, который указан в примере кода.

Одна из перегрузок конструктора 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

Эта версия предоставляет дополнительные параметры как LangVersion или же DeployOnBuild,

Я думаю, что вы не используете правильную версию MSBuild. Попробуйте установить переменную явно в вашем.proj:

<MSBuildExtensionsPath>C:\Program Files (x86)\MSBuild</MSBuildExtensionsPath>
Другие вопросы по тегам