Создание программного сбоя проекта с помощью 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>