argumentos - Cómo llamar a MSBuild desde C#
msbuild project (5)
Sí, agregue una referencia a Microsoft.Build.Engine
y use la clase Engine .
PD: tenga cuidado de hacer referencia a la versión correcta. Hay montajes 2.0 y 3.5 y tendrás que asegurarte de que todos obtengan el correcto .
¿Hay alguna forma mejor de llamar a MSBuild desde C # / .NET que de desgranar a msbuild.exe? Si es así, ¿cómo?
Para una versión específica de .NET 2.0, puede usar lo siguiente:
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();
}
Si usa Microsoft.Build.Engine.Engine
, recibirá una advertencia: This class has been deprecated. Please use Microsoft.Build.Evaluation.ProjectCollection from the Microsoft.Build assembly instead.
This class has been deprecated. Please use Microsoft.Build.Evaluation.ProjectCollection from the Microsoft.Build assembly instead.
Ahora, la forma correcta de ejecutar MSBuild desde C # es la siguiente:
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) });
}
}
CurrentToolsVersion no está disponible en la clase ToolLocationHelper, estoy aquí usando V
Si todo lo que desea es la ruta a la carpeta de herramientas MSBuild, puede usar la clase ToolLocationHelper
del ensamblado Microsoft.Build.Utilities.Core:
var toolsetVersion = ToolLocationHelper.CurrentToolsVersion;
var msbuildDir = ToolLocationHelper.GetPathToBuildTools(toolsetVersion);