Запуск MSBuild во время выполнения - PullRequest
4 голосов
/ 22 февраля 2011

Я пытаюсь скомпилировать свой проект из внешнего приложения, которое генерирует две версии одного и того же проекта (используя константы компиляции).

Я использую этот код для выполнения MsBuild:

string msBuildPath = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "msbuild.exe");
string projectPath = @"D:\NSM\NSM.csproj";     

var startInfo = new ProcessStartInfo(msBuildPath)
                                {
                                    Arguments = string.Format(@"/t:rebuild /p:Configuration=Release /p:DefineConstants=INTVERSION ""{0}""", projectPath),
                                    WorkingDirectory = Path.GetDirectoryName(msBuildPath),
                                    RedirectStandardOutput = true,
                                    RedirectStandardError = true,
                                    UseShellExecute = false
                                };
Console.WriteLine("> msbuild " + startInfo.Arguments);
var process = Process.Start(startInfo);
Console.Write(process.StandardOutput.ReadToEnd());
process.WaitForExit();

Но когда я запускаю программу, я получаю эту ошибку:

Импортированный проект "C: \ Microsoft.CSharp.targets" не найден

Как я могурешить?

Спасибо

1 Ответ

3 голосов
/ 17 марта 2011

Если вы откроете файл NSM.csproj, вы увидите строку, подобную этой:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Проблема в том, что свойство $(MSBuildToolsPath) не установлено, поэтому путь к вашему проекту становится \Microsoft.CSharp.targets, поэтому вы видите ошибку, которую описали. Это не проблема при сборке проекта из среды IDE Visual Studio или командной строки VS, поскольку для вас автоматически устанавливается подходящая среда, в которой устанавливается это свойство.

Таким образом, вне среды VS вам необходимо убедиться, что MSBuildToolsPath настроен до вызова msbuild. msbuild выберет заданные переменные среды в качестве свойств, поэтому один из способов сделать это - установить переменную среды с этим именем до начала msbuild, например ::

Environment.SetEnvironmentVariable("MSBuildToolsPath", RuntimeEnvironment.GetRuntimeDirectory());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...