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

Мне нужно создать проект программно для .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.

Ответ 1

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

Создавать журналы

Интерфейс ILogger

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

Ответ 2

Спасибо @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 = "";
        }
    }

Ответ 3

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

using namespace Microsoft.Build.Evaluation;

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

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

Dan (msbuild dev)