c# - 为什么 ASP.NET 编译器会在每次构建时重建所有二进制文件?

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

当我使用 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 应用程序项目(它们的编译方式不同)。 即使您创建了一个没有任何功能的网站项目和页面,并且从不打开它或在构建之间以任何方式更改它,也会出现此问题。

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

最佳答案

看看这个优秀的answer Eric Lippert 讲述了 C# 编译器如何进行多次传递来编译源代码。尽管功能相同,但您的构建与之前的构建不同的原因有很多。

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

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

关于c# - 为什么 ASP.NET 编译器会在每次构建时重建所有二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14266328/

相关文章:

c# - 如何将 ienumerable 集合附加到 C# 中的现有列表

C# BackgroundWorker ReportProgress Int32?

.net - 7-Zip (7za.dll) .NET 包装器

c# - hunspell 拼写检查

c# - 关于 Enumerable/List 的评估

c# - 在 WPF TextBlock 中显示 XAML 格式的文本

java - 从 ASP.NET MVC 运行 Java 不起作用

c# - 通过 C# 代码隐藏将字符串传递给 .ASPX 中的 SQL

c# - ASP.NET Core MVC MySQL 标识

c# - 按钮命令未触发