2012-03-30 17 views
11

Necesito construir un proyecto programáticamente para un .csproj que estoy creando sobre la marcha. Al buscar en Google, encontré las clases y la API proporcionadas por MS para MSBuild Engine. Con esa información, creo un proceso que ejecuta msbuild.exe y luego lee el resultado, pero ahora quiero usar el espacio de nombres Microsoft.Build.Execution para construir el proyecto. Este es mi programa:Creando programáticamente un proyecto

public class Compiler 
{ 
    private static string locationOfMSBuilldEXE = ""; 
    public static void Build(string msbuildFileName) 
    { 
     BuildManager manager = BuildManager.DefaultBuildManager; 

     ProjectInstance projectInstance = new ProjectInstance(msbuildFileName); 
     var result = manager.Build(new BuildParameters() 
       { 
        DetailedSummary = true 
       }, 
       new BuildRequestData(projectInstance, new string[] { "Build" })); 
     var buildResult = result.ResultsByTarget["Build"]; 
     var buildResultItems = buildResult.Items; 

     string s = ""; 
    } 
} 

Los resultados muestran que esta es la construcción de bien, pero necesitan conocer el resultado detallado de la compilación y cómo visualizarla. Sería realmente útil si alguien puede darme un enlace a un buen tutorial o libro en MSBuild.

Respuesta

8

Necesita agregar una instancia de una clase que implementa la interfaz ILogger a su BuildParameters. Puede agregar una nueva instancia de uno de los registradores suministrados en el espacio de nombres Microsft.Build.Logging, o puede implementar ILogger usted mismo, ya que es muy pequeño y hay una clase de ayuda en el espacio de nombres Microsoft.Build.Utilities llamado Logger que es fácil de extender.

Build loggers

ILogger interface

Logger helper

+0

thankx .. puede también decir a mi dónde encontrar un buen tutorial para el mismo conjunto de espacios de nombres? –

+0

@Parv - Aparte de la documentación (que creo que es excelente), puedes probar esta http://www.amazon.com/Inside-Microsoft%C2%AE-Build-Engine-Pro-Developer/dp/0735626286 –

+0

Solo conozco dos libros dedicados a MSBuild, y ambos son buenos (y revisados ​​por los desarrolladores): (1) El libro de MSPress mencionado anteriormente, pero el enlace es a la primera edición, obtenga el segundo edición, que incluye características 4.0; (2) Consejos y trucos de MSBuild - busque en Amazon - esta es una guía muy avanzada. La documentación de MSDN es bastante limitada, me temo. –

13

Gracias @ritchmelton. Aunque lo descubrí por mi cuenta. Aquí está mi código: He usado un registrador incorporado ConsoleLogger

public class Compiler 
    { 
     private static string locationOfMSBuilldEXE = ""; 
     public static void Build(string msbuildFileName) 
     { 
      ConsoleLogger logger = new ConsoleLogger(LoggerVerbosity.Normal); 
      BuildManager manager = BuildManager.DefaultBuildManager; 

      ProjectInstance projectInstance = new ProjectInstance(msbuildFileName); 
      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; 

      string s = ""; 
     } 
    } 
8

Si lo que desea es construir un proyecto o solución, sin parámetros elaborados, se puede hacer de manera más simple. Pseudocódigo:

using namespace Microsoft.Build.Evaluation; 

var p = Project.Load("path to project"); 
p.SetGlobalProperty("Configuration", "Release"); 
p.Build(...); 

Eso es todo! BuildParameters y demás son para escenarios bastante avanzados. Visual Studio los usa.

Dan (dev msbuild)

+2

¡Impresionante! Tenga en cuenta que la sintaxis ha cambiado en MSBuild 14. Su 'nuevo proyecto (" ruta de acceso al proyecto ")'. – Mrchief

Cuestiones relacionadas