11

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

据我了解,这是由于构建每次构建时都会生成一个新的模块版本 ID(guid)(以区分构建),另一个类似的问题谈到了这一点:我可以在构建时指定模块版本 ID(MVID)吗? .net 程序集?

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

我认为,根据文档(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 有关。我发现无法避免构建之间的这种变化。

4

2 回答 2

2

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

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

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

于 2013-03-26T14:57:34.797 回答
0

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

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

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

于 2013-02-20T04:00:31.630 回答