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
Puedes intentar tomar el control de MSBuild usando MSBuild API
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:
- 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.
- Notifique al sistema si necesita el hilo de UI
- Notifica al sistema si estás haciendo una compilación en tiempo de diseño.
- Registre sus registradores usando el Accessor de Build Manager.
- 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);