以编程方式运行msbuild
我试图以编程方式执行msbuild并且无法执行以下命令:
string command = string.Format(@"C:WindowsMicrosoft.NETFrameworkv4.0.30319msbuild.exe ""{0}{1}.csproj""", _args.ProjectPath, _args.ProjectName);
字符串呈现为:
C:WindowsMicrosoft.NETFrameworkv4.0.30319msbuild.exe "C:...TestResultsFoo 2011-08-31 16_29_40OutFoosolutionNameprojectNameprojectName.csproj"
然后我使用新的ProcessStartInfo(命令)。 问题似乎是Foo和2011之间的空间。我得到以下输出:
MSBUILD : error MSB1008: Only one project can be specified. Switch: 16_29_40OutFoosolutionNameprojectNameprojectName.csproj
如何将项目文件传递给msbuild?
我建议stronlgy通过Microsoft.Build
命名空间中的类/接口去官方路由。 微软在整个地方使用这个,所以这应该算一些……
ESP。 Microsoft.Build.Execution.BuildManager
和Singleton Microsoft.Build.Execution.BuildManager.DefaultBuildManager
是你运行构建任务后的…源代码示例:
您需要使用ProcessStartInfo
的Arguments
属性来传递参数。
例如
var p = new Process(); p.StartInfo = new ProcessStartInfo(@"C:WindowsMicrosoft.NETFrameworkv4.0.30319msbuild.exe") p.StartInfo.Arguments = string.Format(@"{0}{1}.csproj", _args.ProjectPath, _args.ProjectName) p.Start();
但是,对于MSBuild,你应该使用Yahia提到的官方方法。
这是一个带有简单记录器的完整工作示例。
要构建解决方案:
using Microsoft.Build.Evaluation; using Microsoft.Build.Execution; string projectFileName = "C:\Users...\MySolution.sln";//<--- change here can be another VS type ex: .vcxproj BasicLogger Logger = new BasicLogger(); var projectCollection = new ProjectCollection(); var buildParamters = new BuildParameters(projectCollection); buildParamters.Loggers = new List() { Logger }; var globalProperty = new Dictionary(); globalProperty.Add("Configuration", "Debug"); //<--- change here globalProperty.Add("Platform", "x64");//<--- change here BuildManager.DefaultBuildManager.ResetCaches(); var buildRequest = new BuildRequestData(projectFileName, globalProperty, null, new String[] { "Build" }, null); var buildResult = BuildManager.DefaultBuildManager.Build(buildParamters, buildRequest); if (buildResult.OverallResult == BuildResultCode.Failure) { // catch result .. } MessageBox.Show(Logger.GetLogString()); //display output ..
和记录器类(强烈派生这个msdn 记录器 ):
public class BasicLogger : Logger { MemoryStream streamMem = new MemoryStream(); /// /// Initialize is guaranteed to be called by MSBuild at the start of the build /// before any events are raised. /// public override void Initialize(IEventSource eventSource) { try { // Open the file this.streamWriter = new StreamWriter(streamMem); //this.streamWriter = new StreamWriter(logFile); } catch (Exception ex) { if ( ex is UnauthorizedAccessException || ex is ArgumentNullException || ex is PathTooLongException || ex is DirectoryNotFoundException || ex is NotSupportedException || ex is ArgumentException || ex is SecurityException || ex is IOException ) { throw new LoggerException("Failed to create log file: " + ex.Message); } else { // Unexpected failure throw; } } // For brevity, we'll only register for certain event types. Loggers can also // register to handle TargetStarted/Finished and other events. eventSource.ProjectStarted += new ProjectStartedEventHandler(eventSource_ProjectStarted); eventSource.TaskStarted += new TaskStartedEventHandler(eventSource_TaskStarted); eventSource.MessageRaised += new BuildMessageEventHandler(eventSource_MessageRaised); eventSource.WarningRaised += new BuildWarningEventHandler(eventSource_WarningRaised); eventSource.ErrorRaised += new BuildErrorEventHandler(eventSource_ErrorRaised); eventSource.ProjectFinished += new ProjectFinishedEventHandler(eventSource_ProjectFinished); } void eventSource_ErrorRaised(object sender, BuildErrorEventArgs e) { // BuildErrorEventArgs adds LineNumber, ColumnNumber, File, amongst other parameters string line = String.Format(": ERROR {0}({1},{2}): ", e.File, e.LineNumber, e.ColumnNumber); WriteLineWithSenderAndMessage(line, e); } void eventSource_WarningRaised(object sender, BuildWarningEventArgs e) { // BuildWarningEventArgs adds LineNumber, ColumnNumber, File, amongst other parameters string line = String.Format(": Warning {0}({1},{2}): ", e.File, e.LineNumber, e.ColumnNumber); WriteLineWithSenderAndMessage(line, e); } void eventSource_MessageRaised(object sender, BuildMessageEventArgs e) { // BuildMessageEventArgs adds Importance to BuildEventArgs // Let's take account of the verbosity setting we've been passed in deciding whether to log the message if ((e.Importance == MessageImportance.High && IsVerbosityAtLeast(LoggerVerbosity.Minimal)) || (e.Importance == MessageImportance.Normal && IsVerbosityAtLeast(LoggerVerbosity.Normal)) || (e.Importance == MessageImportance.Low && IsVerbosityAtLeast(LoggerVerbosity.Detailed)) ) { WriteLineWithSenderAndMessage(String.Empty, e); } } void eventSource_TaskStarted(object sender, TaskStartedEventArgs e) { // TaskStartedEventArgs adds ProjectFile, TaskFile, TaskName // To keep this log clean, this logger will ignore these events. } void eventSource_ProjectStarted(object sender, ProjectStartedEventArgs e) { // ProjectStartedEventArgs adds ProjectFile, TargetNames // Just the regular message string is good enough here, so just display that. WriteLine(String.Empty, e); indent++; } void eventSource_ProjectFinished(object sender, ProjectFinishedEventArgs e) { // The regular message string is good enough here too. indent--; WriteLine(String.Empty, e); } /// /// Write a line to the log, adding the SenderName and Message /// (these parameters are on all MSBuild event argument objects) /// private void WriteLineWithSenderAndMessage(string line, BuildEventArgs e) { if (0 == String.Compare(e.SenderName, "MSBuild", true /*ignore case*/)) { // Well, if the sender name is MSBuild, let's leave it out for prettiness WriteLine(line, e); } else { WriteLine(e.SenderName + ": " + line, e); } } /// /// Just write a line to the log /// private void WriteLine(string line, BuildEventArgs e) { for (int i = indent; i > 0; i--) { streamWriter.Write("t"); } streamWriter.WriteLine(line + e.Message); } public string GetLogString() { var sr = new StreamReader(streamMem); var myStr = sr.ReadToEnd(); return myStr; } /// /// Shutdown() is guaranteed to be called by MSBuild at the end of the build, after all /// events have been raised. /// /// /// public override void Shutdown() { streamWriter.Flush(); streamMem.Position = 0; } private StreamWriter streamWriter; private int indent; }
还要确保使用正确的MSBuild框架程序集(即不是“4.0”版本)(参见此处 )
上述就是C#学习教程:以编程方式运行msbuild分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/987959.html