¿Cómo construyo una solución programáticamente en C #?

¿Cómo creo una solución de C # programáticamente? Debería poder pasar el camino de una solución y obtener los mensajes de salida (o simplemente crear la solución) ¿cómo logro esto en C #?

La mayoría de ustedes está proporcionando formas de hacerlo llamando comandos externos, pero hay una API, Microsoft.Build.Framework , para comstackr a través de C #


Código del blog:

using Microsoft.Build.BuildEngine; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; public class SolutionBuilder { BasicFileLogger b; public SolutionBuilder() { } [STAThread] public string Compile(string solution_name,string logfile) { b = new BasicFileLogger(); b.Parameters = logfile; b.register(); Microsoft.Build.BuildEngine.Engine.GlobalEngine.BuildEnabled = true; Project p = new Project (Microsoft.Build.BuildEngine.Engine.GlobalEngine); p.BuildEnabled = true; p.Load(solution_name); p.Build(); string output = b.getLogoutput(); output += “nt” + b.Warningcount + ” Warnings. “; output += “nt” + b.Errorcount + ” Errors. “; b.Shutdown(); return output; } } //The above class is used and comstacktion is initiated by the following code, static void Main(string[] args) { SolutionBuilder builder = new SolutionBuilder(); string output = builder.Compile(@”G:CodesTestingTesting2web1.sln”, @”G:CodesTestingTesting2build_log.txt”); Console.WriteLine(output); Console.ReadKey(); } 

Tenga en cuenta que el código en ese blog funciona, pero está un poco anticuado

Microsoft.Build.BuildEngine

ha sido dividido en algunas piezas

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution

Consulte este enlace para ver un ejemplo con la API .NET 4.0 MSBuild:

http://www.odewit.net/ArticleContent.aspx?id=MsBuildApi4&format=html

 List loggers = new List(); loggers.Add(new ConsoleLogger()); var projectCollection = new ProjectCollection(); projectCollection.RegisterLoggers(loggers); var project = projectCollection.LoadProject(buildFileUri); // Needs a reference to System.Xml try { project.Build(); } finally { projectCollection.UnregisterAllLoggers(); } 

Un ejemplo más simple:

 var project = new Project(buildFileUri, null, "4.0"); var ok = project.Build(); // or project.Build(targets, loggers) return ok; 

Recuerde usar .NET 4 Profile (no el perfil del cliente).

Agregue las siguientes referencias: System.XML, Microsoft.Build, Microsoft.Build.Framework y, opcionalmente, Microsoft.Build.Utilities.v4.0.

También mira aquí:

ejecutando msbuild programáticamente

Para construir una solución, haga lo siguiente:

 var props = new Dictionary(); props["Configuration"] = "Release"; var request = new BuildRequestData(buildFileUri, props, null, new string[] { "Build" }, null); var parms = new BuildParameters(); // parms.Loggers = ...; var result = BuildManager.DefaultBuildManager.Build(parms, request); return result.OverallResult == BuildResultCode.Success; 
 // Fix to the path of your msbuild var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe"; Process.Start(pathToMsBuild + " " + pathToSolution); 

Puede crear un archivo .proj:

                

y luego llame a msbuild.exe utilizando el archivo proj como argumento, a continuación se muestra un ejemplo de archivo por lotes. Desde C #, puedes llamar a Process.Start como lo indican otros carteles.

 "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" BuildSolutions.proj pause 

Puedes intentar tomar el control de MSBuild usando MSBuild API

Si necesita ajustar la comstackción desde el código de extensión de Visual Studio, debe tener en cuenta las limitaciones impuestas por la interfaz IVsBuildManagerAccessor; consulte las Notas generales, incluido el nuevo IVsBuildManagerAccessor.docx del Marco de paquetes gestionados para proyectos . Su horquilla también está disponible en github .

En Visual Studio 2010 con MSBuild 4.0, existen nuevas interacciones entre Solution Build Manager y MSBuild que impactan los sistemas de proyectos que utilizan estos servicios. MSBuild 4.0 contiene un nuevo componente llamado Build Manager (que no debe confundirse con Solution Build Manager, que es un componente VS) que controla el envío de solicitudes de comstackción. Esto se hizo necesario ya que Visual Studio 2010 ahora permite que ocurran construcciones paralelas (especialmente proyectos nativos) y el acceso a recursos compartidos como la CPU que necesita ser mediada. Para los sistemas de proyectos que anteriormente simplemente llamaban a Project.Build () para invocar una comstackción, se deben realizar varios cambios. El sistema del proyecto ahora debe:

  1. Solicite el servicio SVsBuildManagerAccessor utilizando la interfaz IServiceProvider. Esto debería hacerse poco después de que se cargue el sistema del proyecto, mucho antes de que ocurra una comstackción.
  2. Notifique al sistema si necesita el hilo de UI
  3. Notifique al sistema si está haciendo una comstackción en tiempo de diseño.
  4. Registre sus registradores usando el Accessor de Build Manager.
  5. Envíe solicitudes de comstackción directamente al MSBuild Build Manager, en lugar de invocar un método en el Proyecto.

Seguramente puede usar msbuild para construir cualquier archivo de solución de Visual Studio.

Creo que puede usar Process.Start para invocar msbuild con los parámetros apropiados.