2012-01-04 11 views
6

uso el siguiente código para compilar una aplicación de C++:compilación C++ aplicación en 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!"); 

pero me da el siguiente error, se observará ninguna idea.

Fecha de creación 2012/01/04 03:32:16 ب.ظ. MSBUILD: error MSB4014: se anuló la compilación debido a una falla interna. MSBUILD: error MSB4014: System.InvalidCastException: no se puede convertir el objeto de tipo 'System.Xml.XmlComment' para escribir 'System.Xml.XmlElement'. MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Project.ProcessProjectChildren (XmlElement projectElement, Cadena projectDirectoryLocation, Boolean importedProject) msbuild: error MSB4014: en Microsoft.Build.BuildEngine.Project.ProcessImportElement (XmlElement importElement, cadena projectDirectoryLocation, Boolean importedProject) MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Project.ProcessProjectChildren (XmlElement projectElement, cadena projectDirectoryLocation, Boolean importedProject) MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Project. ProcessImportElement (XmlElement importE) lement, Cadena projectDirectoryLocation, Boolean importedProject) MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Project.ProcessProjectChildren (XmlElement projectElement, Cadena projectDirectoryLocation, Boolean importedProject) MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine. Project.ProcessMainProjectElement() MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Project.RefreshProjectIfDirty() MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Project.InternalLoadFromXmlDocument (XmlDocument projectXml, ProjectLoadSettings projectLoadSettings) MSBUILD : error MSB4014: en Microsoft.Build.BuildEngine.Project.Load (Stri) ng ProjectFileName, BuildEventContext buildEventContext, ProjectLoadSettings projectLoadSettings) msbuild: error MSB4014:
en Microsoft.Build.BuildEngine.Engine.GetMatchingProject (Proyecto existingProject, Cadena projectFullPath, BuildPropertyGroup globalPropertiesToUse, Cadena toolsVersion, String [] targetNames, BuildEventContext buildEventContext, Boolean toolsVersionPeekedFromProjectFile) MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Engine.BuildProjectFileInternal (BuildRequest buildRequest) MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Engine.EngineBuildLoop ( terminatingBuildRe BuildRequest misión) MSBUILD: error MSB4014: en Microsoft.Build.BuildEngine.Engine.PostProjectEvaluationRequests (Proyecto proyecto, String [] projectFiles, String [] [] targetNames, BuildPropertyGroup [] globalPropertiesPerProject, IDictionary [] targetOutputsPerProject, BuildSettings buildflags, string [] toolVersions)

+0

¿Se puede construir el proyecto C++ en Visual Studio directamente? – ChrisF

+0

sí, por supuesto Dude :) – mefmef

+0

Simplemente marcando "Amigo";) – ChrisF

Respuesta

5
engine.BinPath = @"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319"; 

Este es un problema de versiones, el proyecto está utilizando una versión antigua del motor de MSBuild. Visible desde el seguimiento de la pila, está utilizando el Microsoft.Build.BuildEngine.Project class.Que tiene este atributo:

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

MSBuild fue revisado de manera significativa en .NET 4.0 como parte de la revisión a fondo de la C++ construir el sistema. Que anteriormente usaba un motor de compilación heredado llamado VCBuild y un formato de archivo de proyecto heredado, tenía la extensión de nombre de archivo .vcproj. La versión de MSBuild que está utilizando no sabe nada acerca de esos cambios y no es capaz de analizar correctamente un .vcxproj

Debe actualizar la referencia al ensamblado de referencia Microsoft.Build.Engine.dll. La versión de tiempo de ejecución como se muestra en la ventana Propiedades debe mostrar "v4.0.30319". No tuve mucha suerte usando la clase Microsoft.Build.Evaluation.Project, se queja de que no se pueden encontrar archivos .props y busca en el directorio incorrecto para ellos. Sin embargo, analiza correctamente el archivo .vcxproj :)

+0

Gracias Hans por su aclaración. Intenté usar Evaluation.Project también sin suerte. Me encuentro con algún otro error (error MSB4127: la tarea "SetEnv" no se pudo crear una instancia del ensamblado "... MSBuild \ Microsoft.Cpp \ v4.0 \ v120 \ Microsoft.Build.CppTasks.Common.dll". Please verifique que el conjunto de tareas se haya creado utilizando la misma versión del ensamblado Microsoft.Build.Framework ...) que no tienen sentido para mí (acabo de instalar v120) y si compilo desde cmd funciona como un amuleto. ¿Alguien tiene éxito en esto? – Wizche

Cuestiones relacionadas