16

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

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

这是使用 Visual Studio 2005 / WinForms。

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

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

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

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

4

3 回答 3

14

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

一些 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!
于 2008-09-20T06:52:17.913 回答
10

我认为这将是PE32 规范的 IMAGE_FILE_HEADER 标头中的 TimeDateStamp 字段。

于 2008-09-20T06:48:13.977 回答
-1

可能是版本号或修订号已更改。

于 2008-09-20T05:12:30.243 回答