скомпилировать приложение c ++ на c # - PullRequest
6 голосов
/ 04 января 2012

Я использую следующий код для компиляции одного приложения C ++:

Engine engine = new Engine();
engine.BinPath = @"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319";
BuildPropertyGroup group = new BuildPropertyGroup();
group.SetProperty("Configuration", "Debug");
engine.BuildEnabled = true;
FileLogger logger = new FileLogger();
logger.Parameters = @"logfile=C:\tmp\build.log";
engine.RegisterLogger(logger);
bool success = engine.BuildProjectFile(@"E:\sv_repos\Test\Test\VS2010\Test\Test\Test.vcxproj", new string[] { "Build" }, group);
engine.UnregisterAllLoggers();
if (success)
  MessageBox.Show("build!");

Но я получаю следующую ошибку, любая идея будет оценена.

Сборка началась 2012/01/ 04 03:32:16 ب.ظ.MSBUILD: ошибка MSB4014: сборка была прервана из-за внутренней ошибки.MSBUILD: ошибка MSB4014: System.InvalidCastException: невозможно преобразовать объект типа «System.Xml.XmlComment» в тип «System.Xml.XmlElement».MSBUILD: ошибка MSB4014: в Microsoft.Build.BuildEngine.Project.ProcessProjectChildren (XmlElement projectElement, строковый projectDirectoryLocation, логический импортированный проект) MSBUILD: ошибка MSB4014: в Microsoft.Build.BuildEngine.ProjectOjectElectlelelelelementlementlemplementlemplelelement ()MSBUILD: ошибка MSB4014: в Microsoft.Build.BuildEngine.Project.ProcessProjectChildren (XmlElement projectElement, строковый projectDirectoryLocation, логический импортированный проект) MSBUILD: ошибка MSB4014: в Microsoft.Build.BuildEngine.ProjectOjectElectlelelelelementlementlemplementlemplelelement ()MSBUILD: ошибка MSB4014: в Microsoft.Build.BuildEngine.Project.ProcessProjectChildren (XmlElement projectElement, строковый projectDirectoryLocation, логический импортированный проект) MSBUILD: ошибка MSB4014: в Microsoft.Build.BuildEngine.Project.ProcessMaseBB)Build.BuildEngine.Project., ProjectLoadSettings projectLoadSettings) MSBUILD: ошибка MSB4014:
в Microsoft.Build.BuildEngine.Engine.GetMatchingProject (существующий проект Project, String: в Microsoft.Build.BuildEngine.Engine.BuildProjectFileInternal (BuildRequest buildRequest). MSBUILD: ошибка MSB4014: в Microsoft.Build.BuildEngine.Engine.EngineBuildLoop (BuildRequest terminatingBuildRequest).Project project, String [] projectFiles, String [] [] targetNames, BuildPropertyGroup [] globalPropertiesPerProject, IDictionary [] targetOutputsPerProject, BuildSettings buildFlags, String [] toolVersions)

1 Ответ

5 голосов
/ 11 января 2014
   engine.BinPath = @"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319";

Это проблема управления версиями, ваш проект использует старую версию движка MSBuild. Видимый из трассировки стека, он использует класс Microsoft.Build.BuildEngine.Project . Который имеет этот атрибут:

[ObsoleteAttribute("This class has been deprecated. Please use Microsoft.Build.Evaluation.Project from the Microsoft.Build assembly instead.")]

MSBuild был значительно переработан в .NET 4.0 как часть капитального ремонта системы сборки C ++. Ранее он использовал устаревший механизм сборки с именем VCBuild и устаревший формат файла проекта, он имел расширение имени файла .vcproj. Используемая вами версия MSBuild ничего не знает об этих изменениях и не может правильно проанализировать .vcxproj

Необходимо обновить ссылку на справочную сборку Microsoft.Build.Engine.dll. Версия времени выполнения, отображаемая в окне «Свойства», должна отображать «v4.0.30319». Мне не очень повезло с использованием класса Microsoft.Build.Evaluation.Project, он жалуется на невозможность найти файлы .props и ищет их в неправильном каталоге. Однако он правильно анализирует файл .vcxproj:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...