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