Visual Studio向MSBuild传递了哪些参数?

68

当 Visual Studio 运行构建时,它会运行 MSBuild 来完成大部分工作。如果您将 .sln 文件与适当的配置和平台属性传递给 MSBuild,则它将类似于 Visual Studio 构建您的解决方案。

msbuild mysolution.sln /p:Configuration=Release /p:Platform="Any CPU"

然而,存在一些不同之处:有时构建将通过MSBuild出现错误而不是通过Visual Studio,或者反过来。

Visual Studio会向MSBuild传递哪些参数以影响进程?是否有办法在执行构建时查看它正在传递的参数?


1
从技术上讲,它不运行 MSBuild.exe,而是在内部托管构建引擎,请参阅我的答案以获取更多详细信息。 - Christian.K
2个回答

50

Visual Studio不会执行MSBuild.exe,而是通过Microsoft.Build.*程序集本身来托管构建引擎,至少对于默认的C#项目系统是这样的。其他语言、插件、包等可能会采用不同的方式。

实际上,微软博客上有一系列与此相关的文章,我正在尝试找到它们并更新这个答案。

更新:我又找到了。在这里查找“MSBuild in Visual Studio”帖子。

关于您最初的问题,这个页面可能会对您有所帮助。此外,您可以进入“工具”、“选项”、“项目和解决方案”、“生成和运行”,增加MSBuild输出详细程度。使用“诊断”级别,您应该可以看到启动构建时设置的每个属性。


1
我从未看到过外部的MSBuild进程,所以我认为这是由托管引起的。诊断设置听起来接近我想要的,但如果存在等效的MSBuild命令行语法,它确实使理解变得更加困难。 - Paul Turner
@ProgrammingHero 这就是关键 - 没有这样的命令行。你必须通过“逆向工程”属性来想出它。 - Christian.K
我发现这是一篇好的参考文章http://blogs.msdn.com/b/msbuild/archive/2006/01/06/508981.aspx。我本可以将其编辑到您的答案中,但认为这可能有些傲慢。也许您想添加这个,这样我就可以接受您的答案了? - Paul Turner
这在2015年仍然成立吗?Roslyn会改变这一点吗? - George Mauer
@GeorgeMauer 说实话,我不知道并且还没有时间去研究VS2015 ;- ) 但是,我认为Roslyn使用某种客户端/服务器编译架构,对吗?如果是这样,那么我会猜测VS只是另一个客户端(就像新的csc.exe是另一个客户端一样)。但是,这里完全不确定。 - Christian.K
@Christian.K 这个链接对于“Visual Studio中的MSBuild”帖子无效。 - sorosh_sabz

12

首先,你可以使用/v:diag参数运行msbuild以获取诊断级别的日志记录。这可以帮助弄清楚为什么构建失败。

否则,如果你使用Process Monitor,你可以监视进程启动事件,从中可以看到发送给进程的具体命令行。

具体步骤如下:

  • 运行Process Monitor
  • 筛选»筛选...
  • 操作 is 进程创建 » 添加
  • 操作 is 进程启动 » 添加
  • 确定
  • 通过VS和命令行msbuild运行您的构建
  • 在详细信息列中查看命令行参数

3
如果MSBuild作为一个独立的进程执行,那么这将是可行的方法;不幸的是,至少在Visual Studio 2010中,它并不显示为一个独立的进程。 - Paul Turner

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