web-dev-qa-db-fra.com

Comment créer une solution par programme en C #?

Comment créer une solution C # par programme?

Je devrais pouvoir passer le chemin d'une solution et obtenir les messages de sortie (ou simplement construire la solution). Comment y parvenir en C #?

J'en ai besoin parce que nous construisons une solution unique pour nos projets quand il obtient maintenant tout de SVN et le construit également. Ensuite, tout serait déployé en un seul clic.

31
user677607

La plupart d'entre vous fournissent tous des moyens de le faire en appelant des commandes externes, mais il y a une API, Microsoft.Build.Framework =, pour 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 qui fonctionne, mais qui date un peu

Microsoft.Build.BuildEngine

a été décomposé en quelques morceaux

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution

20
Nix

Consultez ce lien pour un exemple d'utilisation de l'API MSBuild .NET 4.0:

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

Ajoutez les références suivantes: System.XML, Microsoft.Build, Microsoft.Build.Framework et éventuellement Microsoft.Build.Utilities.v4.0.

Regardez aussi ici:

exécutant msbuild par programme

Pour créer une solution, procédez comme 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;
30
W1M0R
// Fix to the path of your msbuild
var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe";

Process.Start(pathToMsBuild + " " + pathToSolution);
5
Justin Niessner
2
Ram

Vous pouvez créer un fichier .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>

puis appelez msbuild.exe en utilisant le fichier proj comme argument, voici un exemple de fichier batch. À partir de C #, vous pouvez appeler Process.Start comme indiqué par d'autres affiches.

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

pause
2
Jon Raynor

Si vous devez déclencher la génération à partir du code d'extension Visual Studio, vous devez tenir compte des limitations imposées par l'interface IVsBuildManagerAccessor - voir les notes générales incluant le nouveau IVsBuildManagerAccessor.docx de Managed Package Framework for Projects . Sa fourchette est également disponible sur github .

Dans Visual Studio 2010 avec MSBuild 4.0, de nouvelles interactions entre Solution Build Manager et MSBuild affectent les systèmes de projet utilisant ces services. MSBuild 4.0 contient un nouveau composant appelé Build Manager (à ne pas confondre avec le Solution Build Manager qui est un composant VS) qui contrôle la soumission des demandes de build. Cela est devenu nécessaire car Visual Studio 2010 permet désormais aux générations parallèles de se produire (notamment les projets natifs) et l'accès aux ressources partagées telles que le CPU doit être médié. Pour les systèmes de projet qui appelaient auparavant simplement Project.Build () pour appeler une génération, plusieurs modifications doivent être apportées. Le système de projet doit maintenant:

  1. Demandez le service SVsBuildManagerAccessor à l'aide de l'interface IServiceProvider. Cela devrait être fait peu de temps après le chargement du système de projet, bien avant que des builds ne se produisent.
  2. Avertissez le système si vous avez besoin du thread d'interface utilisateur
  3. Informez le système si vous effectuez une construction au moment de la conception.
  4. Enregistrez ses enregistreurs à l'aide de l'accessoire Build Manager.
  5. Soumettez les demandes de génération directement au gestionnaire de génération MSBuild, plutôt que d'appeler une méthode sur le projet.
1
Mikhail Filimonov

Vous pouvez certainement utiliser msbuild pour créer n'importe quel fichier de solution Visual Studio.

Je pense que vous pouvez utiliser Process.Start pour appeler msbuild avec les paramètres appropriés.

0
Davide Piras