【发布时间】: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