argumentos c# msbuild build project solution

c# - argumentos - msbuild project



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

¿Cómo construyo una solución 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 puedo lograr esto en C #?


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<ILogger> loggers = new List<ILogger>(); 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 utilizar el perfil .NET 4 (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<string, string>(); 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;


La mayoría de ustedes está proporcionando formas de hacerlo llamando comandos externos, pero hay una API, Microsoft.Build.Framework , para compilar 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 compilation 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 el código en el que funciona el blog, pero está un poco anticuado

Microsoft.Build.BuildEngine

se ha roto en algunos pedazos

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution


Puedes crear un archivo .proj:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <!-- Common --> <Solution Include="Common/Util/Util.sln"/> <Solution Include="Common/EventScheduler/EventSchedulerSolution/EventSchedulerSolution.sln"/> <!-- Server --> <Solution Include="Server/DataLayer/DataTransferObjects/SharedModel/SharedModel.sln"/> <Solution Include="Server/DataLayer/DataTier/ESPDAL.sln"/> <!-- Internal Tools --> <Solution Include="InternalTools/ServerSchemaUtility/ServerSchemaUtility.sln"/> </ItemGroup> <Target Name="Rebuild"> <MSBuild Projects="@(Solution)" Targets="Rebuild" Properties="Configuration=Release"/> </Target> </Project>

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



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.


Si necesita ajustar la compilació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, hay nuevas interacciones entre Solution Build Manager y MSBuild que afectan a los sistemas de proyectos que utilizan estos servicios. MSBuild 4.0 contiene un nuevo componente llamado Build Manager (que no debe confundirse con el Solution Build Manager que es un componente de VS) que controla el envío de solicitudes de compilación. Esto se hizo necesario ya que Visual Studio 2010 ahora permite que se realicen construcciones paralelas (en particular proyectos nativos) y el acceso a recursos compartidos, como la CPU necesaria para ser mediado. Para los sistemas de proyectos que anteriormente simplemente llamaban a Project.Build () para invocar una compilación, se deben realizar varios cambios. El sistema de proyectos ahora debe:

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

// Fix to the path of your msbuild var pathToMsBuild = "C://Windows//DotNet//Framework//msbuild.exe"; Process.Start(pathToMsBuild + " " + pathToSolution);