Comment puis-je construire une solution programmatique en C#?

comment construire une solution c# programmatiquement? Je devrais être capable de passer le chemin d'une solution et obtenir les messages de sortie (ou juste construire la solution ) Comment puis-je atteindre ceci en C#?

30
demandé sur Cœur 2011-06-28 22:33:21

7 réponses

la plupart d'entre vous fournissent des façons de le faire en appelant des commandes externes, mais là est une api, Microsoft.Construire.Cadre , à construire via C#


Code Du 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();
}

Notez le code dans ce blog fonctionne, mais est un peu daté le

Microsoft.Build.BuildEngine

a été décomposé en quelques morceaux

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution

19
répondu Nix 2017-05-22 18:22:57

voir ce lien pour un exemple d'utilisation de L'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 exemple plus simple:

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

N'oubliez pas d'utiliser le profil .NET 4 (pas le profil Client).

ajouter les références suivantes: système.XML, Microsoft.Construire, Microsoft.Construire.Cadre et option Microsoft.Construire.Utilitaire.v4.0.

regardez aussi ici:

exécution msbuild programmatically

pour construire une solution, faites ce qui suit:

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
répondu W1M0R 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
répondu Justin Niessner 2011-06-28 18:36:47

vous pouvez créer un .dossier du projet:

<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>

et appelez msbuild.exe en utilisant le fichier proj comme argument, ci-dessous est un exemple de fichier batch. De C#, vous pouvez appeler le processus.Commencer comme indiqué par d'autres affiches.

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

pause
2
répondu Jon Raynor 2011-06-28 18:47:27
2
répondu Rama 2013-07-22 12:40:30

si vous avez besoin de Tiger la construction à partir du code d'extension de Visual Studio, vous devez considérer les limites imposées par l'interface IVsBuildManagerAccessor-voir le Notes générales, y compris le nouveau Gestionnaire D'accès Ivsbuild.docx de Géré Package Cadre pour des Projets . Sa fourche est également disponible au github .

dans Visual Studio 2010 avec MSBuild 4.0, il y a de nouvelles interactions entre la Solution Gestionnaire de la construction et projet MSBuild which impact systèmes utilisant ces services. MSBuild 4.0 contient un nouveau composant appelé le Gestionnaire de Construire (à ne pas confondre avec le Solution Build Manager qui est un composant VS) qui contrôle soumission des demandes de construction. Cela est devenu nécessaire que Visual Studio 2010 permet désormais aux constructions parallèles de se produire (notamment les projets natifs) et l'accès à des ressources partagées telles que L'UNITÉ CENTRALE DE TRAITEMENT devait faire l'objet d'une médiation. Pour systèmes de projet qui, auparavant, simplement appelé Projet.Build () to invoquer une accumulation de plusieurs modifications doivent être apportées. Le système de projet maintenant doit:

  1. demander le service SVsBuildManagerAccessor en utilisant L'interface IServiceProvider. Cela devrait être fait rapidement après la système de projet est chargé, bien avant tout construit peut se produire.
  2. notifier le système Si vous avez besoin du fil D'UI
  3. aviser le système Si vous effectuez une durée de conception construire.
  4. enregistre ses loggers en utilisant le Build Manager Accessor.
  5. soumettre les demandes de construction directement au gestionnaire de construction de MSBuild, plutôt que d'invoquer une méthode sur le projet.
1
répondu Mikhail Filimonov 2015-06-10 13:44:28

vous pouvez sûrement utiliser msbuild pour construire n'importe quel fichier de solution Visual Studio.

je crois que vous pouvez utiliser Process.Start pour invoquer msbuild avec les paramètres appropriés.

0
répondu Davide Piras 2011-06-28 18:36:46