为什么ASP.. NET编译器在每次构建中重新生成所有二进制文件
本文关键字:新生 二进制文件 构建 NET ASP 编译器 为什么 | 更新日期: 2023-09-27 17:51:19
当我用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应用程序项目(它们的编译方式不同)。此外,即使您创建了一个没有功能的网站项目和页面,并且从未打开或在构建之间以任何方式更改它,也会出现此问题。
对生成的二进制文件进行反编译不会显示任何差异。比较两个"相同"构建的二进制文件时,每次都会发现二进制文件中相同部分的细微差异——我认为这可能与随机构建指南有关。我发现没有办法避免构建之间的这种变化。
看看Eric Lippert关于c#编译器如何通过多次编译来编译源代码的精彩回答。我可以有很多原因,为什么你的构建是不相同的以前一个,虽然功能是相同的。
- 编译器将特殊的语言特性,如使用block with替换为IL的等效物
- 编译器对你的代码做了很多优化,每次迭代可能会产生稍微不同的输出。
- 编译器必须为匿名方法名创建实体化名称,并且每次编译 时它们都是不同的
- 更多的原因,你可以很容易地找出使用反汇编器
检查这些反汇编器并反编译您的库或可执行文件以获得更好的理解。
http://ilspy.net/, http://www.telerik.com/products/decompiler.aspx
我发现在许多情况下使用aspnet_compiler,特别是在我的项目在相同的解决方案中引用其他项目的情况下,导致完全重建,这通常很难解释。(尽管有几次我调查了"变化",即使它们没有真正影响任何东西,比如空白、注释等的变化)
我在visual studio中也遇到了一些插件的问题,这些插件已经完成了从操纵制表和其他空白到实际项目文件等所有事情。虽然这些变化对我们人类来说没有明显的变化,但编译器看了一眼就说:"我看到一个变化!重建所有的东西!"
不确定我的答案是任何帮助,但我会禁用你的插件,运行编译器,然后再次运行编译器,看看会发生什么…