¿Existe alguna forma mejor de llamar a MSBuild desde C# /. NET que con un descascaramiento al msbuild.exe? Si es así, ¿cómo?Cómo llamar a MSBuild desde C#
Respuesta
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 ensamblajes 2.0 y 3.5 y usted tendrá que make sure that everyone gets the right one.
Para una versión .NET 2.0-específico, puede utilizar 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();
}
Para su información, de acuerdo con los documentos, Engine.BinPath está obsoleto. –
Si utiliza Microsoft.Build.Engine.Engine
, obtendrá una advertencia: 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 el 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) });
}
}
Si lo que quieres es la ruta de la carpeta de herramientas de MSBuild, puede utilizar la ToolLocationHelper
class del Microsoft.B Asamblea uild.Utilities.Core:
var toolsetVersion = ToolLocationHelper.CurrentToolsVersion;
var msbuildDir = ToolLocationHelper.GetPathToBuildTools(toolsetVersion);
CurrentToolsVersion no está disponible en la clase ToolLocationHelper, estoy aquí usando V
- 1. Cómo llamar a un destino MSBuild anulado
- 2. cómo llamar a C# desde C++
- 3. Llamar a Python desde C++
- 4. ¿Cómo llamar a C++ desde Java?
- 5. ¿Cómo llamar a Objective-C desde Javascript?
- 6. Cómo llamar a window.alert ("mensaje"); desde C#?
- 7. ¿Llamar a C/C++ desde Python?
- 8. Código de salida de PowerShell - Llamar desde MSBuild
- 9. Llamar a Python desde Objective-C
- 10. Llamar C# desde C++: cómo pasar nullptr a DateTime?
- 11. ¿Cómo puedo llamar a C++/CLI desde C#?
- 12. Llamar a un servicio web desde C++
- 13. Llamar a una función MATLAB desde C#
- 14. Llamar a C# dll desde Delphi
- 15. Llamar a cualquier método Java desde C#
- 16. Llamar código fortran desde C#
- 17. ¿Cómo puedo llamar a Enumerable.Join desde F #?
- 18. Cómo llamar a la funcionalidad C++ desde java
- 19. Cómo puedo llamar a las funciones de C++ desde ruby
- 20. ¿Cómo puedo llamar a notepad.exe desde un programa C?
- 21. Cómo llamar a la función javascript desde C#
- 22. Cómo llamar a las funciones de Matlab desde C++
- 23. Cómo llamar a la función DLL de C# desde VBScript
- 24. Llamar C++ (C) desde el lenguaje D
- 25. Llamar .NET/C# desde R
- 26. ¿Llamar a C# desde C++ nativo, sin/clr o COM?
- 27. Cómo llama a varias secuencias de comandos de MSBuild desde una secuencia de comandos de MSBuild
- 28. ¿Cómo llamar código Java desde C#?
- 29. Cómo detener SSIS desde "Llamar a casa"
- 30. ¿Cómo invocar MSBuild desde PowerShell usando & operator?
pregunta relacionada (pero usa Powershell en lugar de prima C#) - http://stackoverflow.com/ preguntas/472038/how-to-run-msbuild-from-powershell-without-spawning-msbuild-exe-process/473629 –