我需要以编程方式为.csproj构建一个项目,我正在动态创建。
在搜索Google时,我找到了MS为MSBuild Engine提供的类和API。有了这些信息,我创建了一个执行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的好教程或书籍,那将会非常有用。
答案 0 :(得分:14)
谢谢@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 = "";
}
}
答案 1 :(得分:9)
如果您只想构建项目或解决方案,而不需要复杂的参数,则可以更简单地完成。伪代码:
using namespace Microsoft.Build.Evaluation;
var p = Project.Load("path to project");
p.SetGlobalProperty("Configuration", "Release");
p.Build(...);
就是这样! BuildParameters等适用于相当高级的场景。 Visual Studio本身使用它们。
Dan(msbuild dev)
答案 2 :(得分:8)
您需要向ILogger
添加实现BuildParameters
接口的类的实例。您可以在Microsft.Build.Logging
命名空间中添加其中一个提供的记录器的新实例,或者您可以自己实现ILogger
,因为它很小并且Microsoft.Build.Utilities
命名空间中有一个帮助器类称为Logger
,易于扩展。