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


¿Cómo compilo una solución de C# mediante programación? Debería ser capaz de pasar la ruta de una solución y obtener los mensajes de salida ( o simplemente construir la solución) ¿cómo logro esto en C#?

Author: Cœur, 2011-06-28

7 answers

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

Microsoft.Build.BuildEngine

Se ha dividido en algunos pedazos

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution

 19
Author: Nix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-22 18:22:57

Vea este enlace para ver un ejemplo usando la API de. 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 usar el perfil.NET 4 (no el perfil del cliente).

Añadir las siguientes referencias: Sistema.XML, Microsoft.Build, Microsoft.Construir.Framework y opcionalmente Microsoft.Construir.Utilidad.v4. 0.

También mira aquí:

Ejecución de 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;
 29
Author: W1M0R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48
// Fix to the path of your msbuild
var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe";

Process.Start(pathToMsBuild + " " + pathToSolution);
 5
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 18:36:47

Puede 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 llamar a msbuild.exe usando el archivo proj como argumento, a continuación se muestra un ejemplo de archivo por lotes. Desde C#, puedes llamar a Process.Comience como se indica en otros carteles.

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

pause
 2
Author: Jon Raynor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 18:47:27
 2
Author: Rama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 12:40:30

Si necesita completar la compilación a partir del código de extensión de Visual Studio, debe tener en cuenta las limitaciones impuestas por la interfaz de IVsBuildManagerAccessor-consulte la Notas Generales Incluyendo nuevo IVsBuildManagerAccessor.docx from Managed Package Framework for Projects. Su bifurcación también está disponible en github .

En Visual Studio 2010 con MSBuild 4.0, hay nuevas interacciones entre el Gestor de compilación de soluciones y MSBuild que impactan en el proyecto sistema utilizar estos servicios. MSBuild 4.0 contiene un nuevo componente llamado Build Manager (no debe confundirse con el Solution Build Manager que es un componente VS) que controla el envío de solicitudes de compilación. Esto se hizo necesario como Visual Studio 2010 ahora permite que ocurran compilaciones paralelas (especialmente proyectos nativos) y el acceso a recursos compartidos como la CPU necesitaba ser mediado. Para sistemas de proyecto que anteriormente simplemente llamado Proyecto.Build () to invocar una compilación varias hay que hacer cambios. El sistema del proyecto ahora debe:

  1. Solicite el servicio SVsBuildManagerAccessor utilizando la interfaz IServiceProvider. Esto debe hacerse poco después de la el sistema del proyecto está cargado, mucho antes de que ocurran las compilaciones.
  2. Notifique al sistema si necesita el subproceso de interfaz de usuario
  3. Notifique al sistema si está haciendo una compilación en tiempo de diseño.
  4. Registre sus loggers usando el Accessor de Build Manager.
  5. Enviar solicitudes de compilación directamente al Gestor de compilación de MSBuild, en lugar de invocar un método en el Proyecto.
 1
Author: Mikhail Filimonov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-10 13:44:28

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.

 0
Author: Davide Piras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-28 18:36:46