Построение программно проекта - PullRequest
14 голосов
/ 30 марта 2012

Мне нужно создать проект программно для .csproj, который я создаю на лету. При поиске в Google я нашел классы и API, предоставляемые MS для MSBuild Engine. Имея эту информацию, я создаю процесс, который выполняет msbuild.exe и затем читает вывод, но теперь я хочу использовать пространство имен Microsoft.Build.Execution для построения проекта. Это моя программа:

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 = "";
   }
}

Результаты показывают, что это нормально, но мне нужно знать подробные результаты компиляции и как их просматривать. Было бы очень полезно, если бы кто-нибудь дал мне ссылку на хороший учебник или книгу по MSBuild.

Ответы [ 3 ]

15 голосов
/ 30 марта 2012

Спасибо @ritchmelton.Хотя сам разобрался.Вот мой код: я использовал встроенный регистратор 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 = "";
        }
    }
9 голосов
/ 01 апреля 2012

Если вы просто хотите построить проект или решение без сложных параметров, вы можете сделать это проще. Псевдокод:

using namespace Microsoft.Build.Evaluation;

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

Вот и все! BuildParameters и так далее для довольно сложных сценариев. Visual Studio сама их использует.

Dan (msbuild dev)

8 голосов
/ 30 марта 2012

Вам необходимо добавить экземпляр класса, который реализует интерфейс ILogger к вашему BuildParameters. Вы можете добавить новый экземпляр одного из предоставленных регистраторов в пространство имен Microsft.Build.Logging, или вы можете реализовать ILogger самостоятельно, так как он очень маленький, и в пространстве имен Microsoft.Build.Utilities есть вспомогательный класс с именем Logger, который легко удлинить.

Сборщики журнала

Интерфейс ILogger

Помощник регистратора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...