如何从C#调用MSBuild

26

有没有比从C#/.NET中调用msbuild.exe更好的方式来调用MSBuild?如果有,怎么做?


相关问题(但使用 PowerShell 而非原始 C#)- https://dev59.com/9HRB5IYBdhLWcg3w6LR2#473629 - Milan Gardian
5个回答

28

16

如果您需要一个针对.NET 2.0的版本,您可以使用以下代码:

Engine engine = new Engine();
engine.BinPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.System)
    + @"\..\Microsoft.NET\Framework\v2.0.50727";

FileLogger logger = new FileLogger();
logger.Parameters = @"logfile=C:\temp\test.msbuild.log";
engine.RegisterLogger(logger);

string[] tasks = new string[] { "MyTask" };
BuildPropertyGroup props = new BuildPropertyGroup();
props.SetProperty("parm1","hello Build!");

try
{
  // Call task MyTask with the parm1 property set
  bool success = engine.BuildProjectFile(@"C:\temp\test.msbuild",tasks,props);
}
catch (Exception ex)
{
  // your error handler
}
finally
{
 engine.UnregisterAllLoggers();
 engine.UnloadAllProjects();
}

1
如果您只需要获取MSBuild工具文件夹的路径,您可以使用Microsoft.Build.Utilities.Core程序集中的ToolLocationHelper
var toolsetVersion = ToolLocationHelper.CurrentToolsVersion;
var msbuildDir = ToolLocationHelper.GetPathToBuildTools(toolsetVersion);

ToolLocationHelper类中没有可用的CurrentToolsVersion。 - nainaigu
@nainaigu:确保使用的是来自Microsoft.Build.Utilities.Core而非Microsoft.Build.UtilitiesToolLocationHelper - Cameron

1
如果你使用Microsoft.Build.Engine.Engine,你会收到一个警告:该类已经被弃用,请改为使用Microsoft.Build.Evaluation.ProjectCollection自Microsoft.Build程序集。 现在,从C#运行MSBuild的正确方式如下:
public sealed class MsBuildRunner
{

    public bool Run(FileInfo msbuildFile, string[] targets = null, IDictionary<string, string> properties = null, LoggerVerbosity loggerVerbosity = LoggerVerbosity.Detailed)
    {
        if (!msbuildFile.Exists) throw new ArgumentException("msbuildFile does not exist");

        if (targets == null)
        {
            targets = new string[] {};
        }
        if (properties == null)
        {
            properties = new Dictionary<string, string>();
        }

        Console.Out.WriteLine("Running {0} targets: {1} properties: {2}, cwd: {3}",
                              msbuildFile.FullName,
                              string.Join(",", targets),
                              string.Join(",", properties),
                              Environment.CurrentDirectory);
        var project = new Project(msbuildFile.FullName, properties, "4.0");
        return project.Build(targets, new ILogger[] { new ConsoleLogger(loggerVerbosity) });
    }

}

0

ToolLocationHelper类中没有CurrentToolsVersion可用,我在这里使用V


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接