为什么在干净的构建之后生成了不同的dll,没有代码更改?

时间:2008-09-20 05:09:49

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

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

Diff显示DLL中的一些字节有变化 - 很少接近开头,很少接近结尾,但我无法弄清楚这些代表什么。有没有人对这种情况发生的原因有什么见解以及如何预防?

这是使用Visual Studio 2005 / WinForms。

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

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

  • 文件开头的PE头中有两个字节。
  • < PrivateImplementationDetails> { guid }部分
  • 字符串表的隐藏部分接近结尾(不知道为什么,我没有改变字符串)
  • 文件末尾的部分信息。

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

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分:10)

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

答案 2 :(得分:-1)

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