c# - 为什么在没有代码更改的干净构建后会生成不同的 dll?

标签 c# .net visual-studio build-process

当我干净地构建我的 C# 项目时,生成的 dll 与之前构建的不同(我单独保存)。没有进行任何代码更改,只是清理并重建。

Diff 显示 DLL 中的一些字节发生了变化——在开头和结尾附近的字节很少,但我无法弄清楚这些代表什么。有没有人知道为什么会发生这种情况以及如何预防?

这是使用 Visual Studio 2005/WinForms。

更新:不使用自动版本递增,或对程序集进行签名。如果它是某种时间戳,我如何防止 VS 写入它?

更新:在查看 Ildasm/diff 后,似乎以下项目有所不同:

  • 文件开头的 PE header 中的两个字节。
  • {guid} 部分
  • 接近末尾的字符串表的神秘部分(想知道为什么,我没有更改字符串)
  • 文件末尾的部分装配信息。

不知道如何消除这些,如果可能的话......

最佳答案

我最好的猜测是您看到的更改字节是在构建时自动生成的内部使用的元数据列。

一些 Ecma-335 Partition II(CLI 规范元数据定义)列可以在每次构建时更改,即使源代码根本没有更改:

  • Module.Mvid:构建时生成的 GUID。每次构建都会发生变化。
  • AssemblyRef.HashValue:如果您引用的是另一个自旧构建以来也已重建的程序集,则可能会发生变化。

如果这真的非常困扰您,我最好的建议是找出正在发生的变化,比较实际的元数据表。获取这些的方法是使用 ildasm MetaInfo 窗口:

View > MetaInfo > Raw:Header,Schema,Rows // important, otherwise you get very basic info from the next step

View > MetaInfo > Show!

关于c# - 为什么在没有代码更改的干净构建后会生成不同的 dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/107196/

相关文章:

c# - 递归上传到Azure文件/创建子文件夹

c# - 在 IIS 7 中为运行时的 WCF 项目加载 native 托管和 C++ DLL

c# - 由于约束错误,无法在 C# 中实现 VB 接口(interface)

c# - 从 JWT 验证 User.Identity

c# - 将 DataRowCollection 转换为 NameValueCollection

c# - 委托(delegate)的可选参数不能正常工作

c# - 根据在 C# 中创建的日期搜索文件

c# - 递归列出给定路径下的所有文件和文件夹?

c - Microsoft Visual Studio 2017 需要非常基本的帮助 : "The system cannot find the file specified"

c# - 如何删除 Windows 模拟器中的调试字符串?