【问题标题】:Why does the ASP.NET Compiler rebuild all binaries in every build?为什么 ASP.NET 编译器在每次构建中都重建所有二进制文件?
【发布时间】:2013-01-10 20:04:58
【问题描述】:

当我使用 aspnet_compiler 重新编译我的项目(asp.net、c#)时,即使没有进行任何代码更改,重建的二进制文件也会发生变化(与之前的构建相比)。

据我所知,这是由于构建每次构建时都会生成一个新的模块版本 ID (guid)(以区分构建),另一个类似的问题谈到了这一点:Can i specify the module version id (MVID) when building a .net assembly?

上面链接的问题似乎表明没有办法重建项目并让二进制文件与相同未更改代码的先前版本相匹配.. 好的,很好,我明白 - 但是为什么要重建所有二进制文件?

我认为,根据文档 (http://msdn.microsoft.com/en-us/library/ms229863(v=vs.80).aspx),除非将 -c 指定为参数,否则 aspnet_compiler 应该只重建那些实际需要的二进制文件(由于代码更改)。是我误会还是遗漏了什么?

我正在使用的 aspnet_compiler 参数:

aspnet_compiler -f -u -fixednames -nologo -v / -p .\myproject\ .\mybuild\

请注意,此问题仅发生在网站项目中,而不是 Web 应用程序项目(它们的编译方式不同)。 即使您创建了一个没有功能的网站项目和页面,并且在构建之间永远不要打开或更改它,也会出现此问题。

反编译生成的二进制文件显示没有差异。比较两个“相同”构建的二进制文件每次都会显示二进制文件的同一部分存在微小差异 - 我认为这可能与随机构建 guid 有关。我发现无法避免构建之间的这种变化。

【问题讨论】:

  • 我对 aspnet_compiler 并不特别熟悉,我可能完全不了解这里,但您可能需要检查源文件上的时间戳。尽管使用不同的编译器,但我曾经遇到过与您描述的类似的事情。原来我不知何故有一个带有时间戳的源文件,所以编译器一直认为二进制文件已经过时了。
  • 是的,应检查时间戳以确保未注意到的微小更改(空格、注释等)强制重新编译。本指南对我很有用:blogs.msdn.com/b/jamesche/archive/2007/09/27/….

标签: c# asp.net .net aspnet-compiler


【解决方案1】:

查看 Eric Lippert 撰写的这篇出色的 answer,了解 C# 编译器如何通过多次传递来编译源代码。尽管功能相同,但您的构建与前一个不同,我可能有很多原因。

  • 编译器替换了特殊的语言功能,例如使用与 IL 等效的块
  • 编译器会对您的代码进行许多优化,每次迭代可能会产生略微不同的输出。
  • 编译器必须为匿名方法名称创建具体化名称,并且每次编译时它们都不同
  • 还有更多原因,您可以使用反汇编程序轻松搞定

查看这些反汇编程序并反编译您的库或可执行文件以获得更好的理解。
http://ilspy.net/ , http://www.telerik.com/products/decompiler.aspx

【讨论】:

  • 这并没有解决我的问题(我不再确定它是否可以解决),但我确实很感激这个答案;埃里克·利珀特(Eric Lippert)的答案链接是一本好书。
【解决方案2】:

我发现在很多情况下都使用 aspnet_compiler,尤其是在我的项目在同一解决方案中引用其他项目的情况下,会导致通常难以解释的完全重建。 (尽管我调查过几次“变化”,即使它们并没有真正影响任何东西,例如对空格、cmets 等的更改)

Visual Studio 中的一些插件也有问题,这些插件完成了从操作制表和其他空白、实际项目文件等所有工作。虽然这些更改对我们人类没有明显的变化,但编译器需要一看就知道“我看到了变化!REBUILD ALL THE THINGS!!!

不确定我的回答是否有帮助,但我会禁用你的插件,运行编译器,然后再次运行编译器,看看会发生什么......

【讨论】:

    猜你喜欢
    • 2022-07-23
    • 2021-11-05
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多