2012-03-30 27 views
11

Potrzebuję zbudować program programowo dla .csproj, który tworzę w locie. Podczas wyszukiwania w Google znalazłem klasy i API dostarczone przez MS dla MSBuild Engine. Za pomocą tych informacji tworzę proces, który uruchamia msbuild.exe, a następnie odczytuje wynik, ale teraz chcę użyć przestrzeni nazw Microsoft.Build.Execution do zbudowania projektu. To jest mój program:Budowanie programowo projektu

public class Compiler 
{ 
    private static string locationOfMSBuilldEXE = ""; 
    public static void Build(string msbuildFileName) 
    { 
     BuildManager manager = BuildManager.DefaultBuildManager; 

     ProjectInstance projectInstance = new ProjectInstance(msbuildFileName); 
     var result = manager.Build(new BuildParameters() 
       { 
        DetailedSummary = true 
       }, 
       new BuildRequestData(projectInstance, new string[] { "Build" })); 
     var buildResult = result.ResultsByTarget["Build"]; 
     var buildResultItems = buildResult.Items; 

     string s = ""; 
    } 
} 

Wyniki pokazują, że to jest budowanie porządku, ale trzeba znać szczegółowe wyjście z kompilacji oraz sposobu, żeby go zobaczyć. Byłoby bardzo pomocne, gdyby ktoś mógł podać mi link do dobrego samouczka lub książki na temat MSBuild.

Odpowiedz

8

Musisz dodać wystąpienie klasy, która implementuje interfejs ILogger do Twojego BuildParameters. Możesz dodać nowe wystąpienie jednego z dostarczonych rejestratorów w przestrzeni nazw Microsft.Build.Logging lub możesz sam wdrożyć ILogger, ponieważ jest bardzo mała i istnieje klasa pomocnicza w przestrzeni nazw Microsoft.Build.Utilities o nazwie , która jest łatwa do rozszerzenia.

Build loggers

ILogger interface

Logger helper

+0

thankx .. można również powiedzieć moim gdzie znaleźć dobry poradnik dla tego samego zestawu nazw? –

+0

@Parv - inne niż dokumentacja (która moim zdaniem jest doskonała), możesz spróbować tego http://www.amazon.com/Inside-Microsoft%C2%AE-Build-Engine-Pro-Developer/dp/0735626286 –

+0

Są tylko dwie książki poświęcone MSBuild, o których jestem świadomy, i oba są dobre (i sprawdzone przez programistów): (1) Wspomniana wyżej książka MSPress - ale link jest do pierwszej edycji, zdobądź drugą wydanie, które obejmuje 4.0 funkcje; (2) Wskazówki i triki MSBuild - szukaj w Amazon - to bardzo zaawansowany poradnik. Dokumentacja MSDN jest dość ograniczona, obawiam się. –

13

Dzięki @ritchmelton. Chociaż sam to wymyśliłem. Oto mój kod: Użyłem in wbudowanym rejestratorem ConsoleLogger

public class Compiler 
    { 
     private static string locationOfMSBuilldEXE = ""; 
     public static void Build(string msbuildFileName) 
     { 
      ConsoleLogger logger = new ConsoleLogger(LoggerVerbosity.Normal); 
      BuildManager manager = BuildManager.DefaultBuildManager; 

      ProjectInstance projectInstance = new ProjectInstance(msbuildFileName); 
      var result = manager.Build(
       new BuildParameters() 
       { 
        DetailedSummary = true, 
        Loggers = new List<ILogger>(){logger} 
       }, 
       new BuildRequestData(projectInstance, new string[] { "Build" })); 
      var buildResult = result.ResultsByTarget["Build"]; 
      var buildResultItems = buildResult.Items; 

      string s = ""; 
     } 
    } 
8

Jeśli chcesz po prostu zbudować projekt lub roztwór, bez skomplikowanych parametrów, można to zrobić prościej. Pseudokod:

using namespace Microsoft.Build.Evaluation; 

var p = Project.Load("path to project"); 
p.SetGlobalProperty("Configuration", "Release"); 
p.Build(...); 

To wszystko! BuildParameters i tak dalej są dla dość zaawansowanych scenariuszy. Visual Studio sam ich używa.

Dan (msbuild dev)

+2

Awesome! Zwróć uwagę, że składnia została zmieniona w MSBuild 14. Jego 'nowy projekt (" ścieżka do projektu ")'. – Mrchief

Powiązane problemy