当我使用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\请注意,此问题仅发生在WebSite项目中,而不是Web应用程序项目中(它们的编译方式不同)。同样,即使您创建了一个没有任何功能的WebSite项目和页面,并且永远不会在两次构建之间打开或更改它,也会出现此问题。
反编译生成的二进制文件没有任何差异。比较两个“相同”构建的二进制文件,每次都会发现二进制文件的相同部分存在微小差异-我相信这可能与随机构建guid有关。我找不到任何方法来避免构建之间的这种变化。
发布于 2013-03-26 22:57:35
请查看Eric Lippert的这篇优秀的answer,它讲述了C#编译器如何进行多次遍历来编译源代码。我可以有很多原因,为什么你的构建与前一个不相同,尽管功能是相同的。
块编译器替换了特殊的语言功能,例如在IL equivalents
轻松地找出原因
查看这些反汇编程序并反编译您的库或可执行文件,以获得更好的理解。
http://ilspy.net/,http://www.telerik.com/products/decompiler.aspx
https://stackoverflow.com/questions/14266328
复制相似问题